pocketgl

news2024/11/17 3:08:16

pocketgl支持在自己的web页面集成类似 Shadertoy、 Threejs 等基于webGL 的渲染图形窗口, 并且拥有shader代码高亮编辑器支持实时修改和预览。 其自带的mesh包含两个Sphere 和 Teaport, 同时支持上床自定义的网格 和 背景天空盒。其既支持像Shadertoy 这种只包含frag 的着色器, 可以用来实现一些后处理效果和 SDF配合RayMatch的材质, 也支持vert的顶点着色器。

环境安装

Pocket.gl 基于nodejs的前端库:

  • Three.js, 3D 渲染
  • Ace, 代码编辑器
  • dat.GUI, GUI 截面绘制
  • clipboard.js, 复制粘贴版操作
  • RequireJS, Loading条

pocketgl 依赖 nodejs 和 npm 环境, 在确保安装的情况下, 通过npm 安装bower, 如下命令:

npm install -g bower

获取 pocketgl 可以通过 bower 来安装:

bower install pocket.gl --save

也可以直接通过 此链接下载 zip包。

进入到项目目录下, 执行下面命令, 安装所有依赖的包

bower install

如果安装成功, 在当前目录会出现一个 bower_components 的目录, 这里有所有依赖的插件包。

编译

编译过程依赖于 require.js 优化器去组织各个模块。 编译生成的js存放在dist目录。

These batch scripts can be used to build the library:

  • build/build.bat – 生成 dist/pocket.gl.js
  • build/build-min.bat – 生成 the dist/pocket.gl.min.js
  • build/build-all.bat – 上面二者同时生成

其实 .bat 里面的内容也是调用 node相关的接口, 对于非windows平台, 可以直接把 .bat 后缀修改.sh 在mac 或者linux平台去运行。

加载

在你的页面加载 pocketgl, 可以直接在你的代码里加如下:

// 使用本地编译生成的
<script src="dist/pocket.gl.min.js/>

// 使用上传 RawGit的
<script src="https://cdn.rawgit.com/gportelli/pocket.gl/v1.2.4/dist/pocket.gl.min.js"/>

然后在js里实例化一个 PocketGL

new PocketGL("myContainer");

构造

PocketGL 一共三个参数, 其中最后两个是可选项。

PocketGL(container, [config], [baseURL]);
  • container – (string) 绑定div的id属性名, 通过css可以定义窗口的大小
  • config – (object or string, 可选项) 可以绑定一个js,参数是js的路径。 一般是类似官方例子里 param.js , 可以定义外部传入shader的uniform值, 同时用来在右上角画gui。
  • baseURL – (string, 可选项) 指定第二步config 的基础路径。

使用如下:

// examples 是几个官方例子,通过index进行切换
new PocketGL(widgetContainer,
    "data/" + examples[index] + "/params.js", 
    "data/" + examples[index]); 

配置

由于 PocketGL 可以通过第二个参数绑定js支持自定义的效果, 这里详细讲下js里相关的字段。

Shaders

  • vertexShader – (string) vertex shader 代码.
  • fragmentShader – (string) fragment shader 代码.
  • vertexShaderFile – (string) 通过一个路径URL绑定一个vert shader的 .glsl文件
  • fragmentShaderFile – (string) 通过一个路径URL绑定一个frag shader的 .glsl文件

pocketgl内置的uniform变量, 不需要声明, 可以在shader里直接引用。

// vertex shader prefix
// = object.matrixWorld
uniform mat4 modelMatrix;

// = camera.matrixWorldInverse * object.matrixWorld
uniform mat4 modelViewMatrix;

// = camera.projectionMatrix
uniform mat4 projectionMatrix;

// = camera.matrixWorldInverse
uniform mat4 viewMatrix;

// = inverse transpose of modelViewMatrix
uniform mat3 normalMatrix;

// = camera position in world space
uniform vec3 cameraPosition;

attribute vec3 position;
attribute vec3 normal;
attribute vec2 uv;
attribute vec2 uv2;

// fragment shader prefix
uniform mat4 viewMatrix;
uniform vec3 cameraPosition;

如下面vert代码中,直接使用相关的代码进行 位置的坐标系变换:

gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
// or
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4( position, 1.0 );

关于鼠标跟踪

你可以在shader 里使用mouse这个uniform vec4变量, 其中xy分量代表鼠标在当前屏幕里的像素位置,zw分量代表鼠标的相对运动位移。使用如下面代码:

uniform vec4 mouse;
uniform float time;

void main()	{
	vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;
	p.y *= resolution.y / resolution.x;

	// Rotation
	vec2 rot = -vec2(mouse.z, mouse.w) / resolution * vec2(2.0*PI, PI);
	...
}

添加GUI

右上角的GUI界面会根据下面格式来绑定uniform变量, 这些变量可以同步到shader。

uniforms: [
  { 
    type: typename, 
    value: defaultValue, 
    min: minValue, 
    max: maxValue, 
    name: variableName,
    GUIName: name
  }
]
  • type - string类型, 支持 “float”, “integer”, “boolean” 和 “color”,
    其中boolean强转float的时候会变成0或者1, 颜色color对应shader里的vec3类型
  • value 设置默认值, 其中颜色可以这样填: [#RRGGBB or #RGB]
  • min - float 类型, 最小值
  • max - float 类型, 最大值
  • name - string类型, 绑定shader里的uniform名
  • GUIName - string类型, UI界面上显示的名称

例子:

uniforms: [
  { 
    type: "boolean", 
    value: false, 
    name: "flatShading",
    GUIName: "Flat shading" 
  },
  { 
    type: "color", 
    value: "#26a00c", 
    name: "diffuseColor",
    GUIName: "Color"
  },
  { 
    type: "float", 
    value: 0.5, 
    min: 0, 
    max: 1,
    name: "specularGloss", 
    GUIName: "Glossiness"
  },
  { 
    type: "integer", 
    value: 5, 
    min: 0, 
    max: 10, 
    name: "specularIntensity",
    GUIName: "Specular intensity"
  }
]

绑定在shader对应的unifrom变量名:

uniform float flatShading;
uniform vec3 diffuseColor;
uniform float specularGloss;
uniform float specularIntensity;
Group名

Pocketgl还支持分组, 如下配置:

uniforms: [
  [
    { groupName: "Group 1" },
    { type: "float", value: 0.5, min: 0, max: 1, name: "v1", GUIName: "Var 1" },
    { type: "boolean", value: true, name: "v2", GUIName: "Var 2" }
  ],
  [
    { groupName: "Group 2" },
    { type: "float", value: 0.5, min: 0, max: 1, name: "v3", GUIName: "Var 3" },
    { type: "boolean", value: true, name: "v4", name: "Var 4" }
  ],
  [
    { groupName: "Group 2", opened: true },
    { type: "float", value: 0.5, min: 0, max: 1, name: "v5", GUIName: "Var 5" },
    { type: "boolean", value: true, name: "v6", GUIName: "Var 6" }
  ]
]

对应到GUI显示如下:

在这里插入图片描述

Mesh网格

支持 OBJ 和 Collada 两种格式, 同时你可以下面配置指定mesh相关的属性:

meshes: [
  { 
    // Procedural mesh
    type: typename, 
    subdivision: numberOfSubdvisions, 

    // External mesh
    url: meshURL,

    name: nameInTheGUI,
    x: xOffset, y:yOffset, z: zOffset,
    rx: xRotation, ry: yRotation, z: zRotation
    scale: meshScale,
    doubleSided: showBackFaces,
    transparent: useAlphaChannel
  }
]
  • type – (string) 本地内置的网格, 目前支持以下:
    “teapot”, “cube”, “sphere”, “torus”, “cylinder”, “plane”
  • subdivision – (integer, optional) 网格的细分数量。
  • url – (string URL) 本地路径 或者名字
  • name – (string) GUI显示名称.
  • x, y, z – (float, optional) 网格对象的位置
  • rx, ry, rz – (float, optional) 网格对象的旋转.
  • scale – (float) 缩放.
  • doubleSided – (boolean) 是否渲染两面(前和后)
  • transparent – (boolean) 是否开启透明

范例:

meshes: [
  { url: "light-bulb.obj",  name: "Light Bulb (obj)", rx: 90, scale: 0.17},
  { type: "teapot", name: "Teapot", doubleSided: true},
  { type: "sphere", name: "Sphere"},
  { type: "torus", name: "Torus"},
  { type: "cylinder", name: "Cylinder"},
  { type: "cube", name: "Cube"},
  { type: "plane", name: "Plane", doubleSided: true}
]

材质

mesh支持绑定单独的材质, 使用默认的shader, 即不在param.js里填写 shader相关的字段, 如vertexShader, vertexShaderFile等, 材质支持以下类型:

  • color – (string, [#RRGGBB or #RGB], optional) 漫反射颜色diffuse.
  • specular – (string, [#RRGGBB or #RGB], optional) 高光颜色specular.
  • shininess – (number, optional) 高光反射/光泽度
  • diffuseMap – (string, optional) 漫反射贴图URL .
  • normalMap – (string, optional) 法线贴图URL.

如下面例子:

meshes: [
  { 
    url: "dice.obj", name: "Dice", 
    // one material with diffuse and normal map
    materials: [
      { 
        diffuseMap: "diffuse.jpg", 
        normalMap: "normal.png" 
      }
    ]
  },
  {
    url: "light-bulb.obj", name: "Light Bulb", 
    // two materials with two colors assigned to each sub-mesh
    materials: [
      { color: "#aaa" },
      { color: "#c0a84a" }
    ]
  }
]

贴图

定义贴图的采样方式以及wrap 可以通过如下方式:

textures: [
  { 
    url: textureURL, 
    wrap: wrapType,
    filter: filtertype, 
    name: variableName
  }
]
  • url – (string, mandatory) 贴图URL, 支持 JPEG 和 PNG.
  • wrap – (string, optional) 支持两个格式: “repeat” or “clamp”.
  • filter – (string, optional) 支持两种格式: “linear” or “nearest”.
  • name – (string, mandatory) shader里的 uniform sampler2D 变量.

外观

  • width – (integer) 窗口宽.
  • height – (integer) 窗口高.
  • backgroundColor – (string, [#RRGGBB or #RGB]) 默认背景颜色.
  • tabColor – (string,[#RRGGBB or #RGB]) tab页签颜色.
  • tabTextColor – (string,[#RRGGBB or #RGB]) tab页签字体颜色.
{
  width: 800, 
  height: 600, 
  backgroundColor: "#300", 
  tabColor: "#f00", 
  tabTextColor: "#555", 
  GUIClosed: true 
}

天空盒

将默认背景色替换为天空盒。

  • skybox – 按顺序定义box的六个面的图: right, left, top, bottom, front, back. 或者使用单张全景图.

shader中提供一个名为tCube的uniform变量,表示立方体贴图纹理。

// cubemap skybox shader uniform
uniform samplerCube tCube;

对于全景图, shader 定义为tEquirect

// equirectangular skybox shader uniform
uniform sampler2D tEquirect;

Cubemap 例子:

// cubemap skybox
skybox: [
  "cubemap/px.jpg", "cubemap/nx.jpg", 
  "cubemap/py.jpg", "cubemap/ny.jpg", 
  "cubemap/pz.jpg", "cubemap/nz.jpg",
]

全景图例子:

// equirectangular skybox
skybox: "textures/panorama.jpg"

Camera

  • orbiting – (boolean) 允许使用拖动鼠标去旋转视角.
  • autoOrbit – (boolean) 允许相机自动旋转(如果设置为true,动画将强制设置为true).
  • autoOrbitSpeed – (number) 自动旋转速度 (一个单位代表6度每秒).
  • cameraDistance – (number) 设置摄影机与网格轴的距离
  • cameraPitch – (number) 相机 pitch 角.
  • cameraYaw – (number) 相机yaw角
  • cameraFOV – (number) 设置相机的fov.
  • zoom – (boolean) 允许camera随着鼠标齿轮滑动进行缩放.
{
  orbiting: true, zoom: true, 
  autoOrbit: true, autoOrbitSpeed: 0.5,
  cameraDistance: 100, cameraPitch: 27, cameraYaw: 0
}

动画

  • animated – (boolean) 如果为true,画布将在每帧更新(通常为60fps),并且着色器中将提供时间统一变量。如果为false,则只有在窗口调整大小时才会重新绘制画布,从而减少开销.
  • playButtons – (boolean)如果设置为true并且animated为true,则会显示一些播放控制按钮(播放、停止、暂停)

编辑器

  • editorTheme – (string) 设置主题. 有 “dark” 和 “bright” 两个选项
  • editorWrap – (boolean) 如果设置为true,则在编辑器中启用文本换行
  • showTabs – (boolean) 如果设置为false,则选项卡将被删除,编辑器将不可用
{
  editorTheme: "bright", 
  editorWrap: false, 
  showTabs: true
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/655206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[元带你学: eMMC协议详解 13] 数据读(Read) 写(Write) 详解

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 4700字&#xff0c; 主要内容 1. 数据读取 2. 块读取操作 3. 数据写 4.块写操作 参考 1. 数据读取 当没有数据传输时&#xff0c;DATO-D…

Python使用happybase写入HBase

HBase是一个分布式的、面向列的NoSQL数据库&#xff0c;可以存储大量的非结构化或半结构化的数据。tif是一种常见的影像文件格式&#xff0c;可以存储多波段的栅格数据。本文将介绍如何使用Python的happybase模块和gdal模块&#xff0c;从tif格式的影像文件中读取数据&#xff…

排序算法的奇妙冒险

排序算法的奇妙冒险 一.排序的概念1.1 排序的定义1.2 排序的稳定性1.3 排序的内排序和外排序 二.插入排序2.1 直接插入排序2.2 希尔排序 三.选择排序3.1直接选择排序3.2 堆排序 四.交换排序4.1 冒泡排序4.2 快速排序**选取基准值的方法**快速排序的优化非递归实现快速排序 五.归…

Web3简述MetaMask并演示谷歌安装MetaMask扩展程序方式

Web3到现在理论这段是说的有点太多了 那么 我们先来看个东西 叫 MetaMask 这个在我们项目开发过程中需要使用 其实 你如果去找MetaMask 可能会被一些关键字下到 可能会看到 虚假 诈骗等关键字 因为 这个东西本事就是一个开源的以太坊的一个钱包 那么 钱包肯定就是用来管理资产…

LoadDef python工具包学习一:计算love数

首先在github下载这个工具箱&#xff1a;https://github.com/hrmartens/LoadDef 下载完毕&#xff0c;解压缩进入如下的界面&#xff0c;点击进入working工作文件夹。在doc文件夹里面有帮助文档和教程&#xff0c;有需要的可以仔细阅读。 loaddef主要的功能模块包括&#xff1…

力扣日记1494

1. 题目 [LeetCode 1494. 并行课程 II]https://leetcode.cn/problems/parallel-courses-ii/) 1.1 题意 严格按照选课先修顺序选课&#xff0c;每个学期选课数有上限&#xff0c;求选完所有课程的最短学期数 1.2 分析 这道题的数据量很小&#xff0c;而且作为困难题&#xff…

一起学 WebGL:纹理对象学习

大家好&#xff0c;我是前端西瓜哥&#xff0c;今天我们来了解 WebGL 的纹理对象&#xff08;Texture&#xff09; 纹理对象&#xff0c;是将像素&#xff08;texels&#xff09;以数组方式传给 GPU 的对象&#xff0c;常见场景是贴图&#xff0c;就是将图片的数据应用到 3D 物…

vue 根据word摸板导出word文档,并压缩为zip

yarn add jszip3.10.1 yarn add jszip-utils0.1.0 yarn add pizzip3.1.4 yarn add docxtemplater3.29.5 yarn add docxtemplater-image-module-free1.1.1 yarn add file-saver2.0.5 注意&#xff1a;这里的fileUrl必须是绝对路径&#xff0c;否则可能会报 is not zip的错误&…

当pytest遇上poium会擦出什么火花

当pytest遇上poium会擦出什么火花 首先&#xff0c;创建一个test_sample/test_demo.py 文件&#xff0c;写入下面三行代码。 def test_bing(page):page.get("https://www.bing.com")assert page.get_title "必应"不要问题 page 从哪里来&#xff0c;打开…

(LLM) 的所有知识;10分钟了解向量数据库;微软 Bing 可以识别图片了;

&#x1f989; AI新闻 &#x1f680; 微软 Bing 可以识图」了&#xff0c;吊打 GPT-4&#xff1f; 摘要&#xff1a;微软 Bing 最新识图功能让用户可以上传图片并进行编程、做题、看病等操作&#xff0c;还能分析梗图笑点。然而在某些情况下表现不佳&#xff0c;例如无法数清…

技术分享 | i.MX8M Plus开发板 固定IP地址以及单网口多IP设置

以启扬IMX8MP开发板为例&#xff0c;给大家分享固定IP地址以及单网口多IP设置的步骤流程。 固定IP地址设置 20-wired.network 重启Network生效 网口多ip设置 对于一些网络管理的命令 connman设置&#xff08;参考&#xff09; imx8 yocto系统的init system使用systemd&#xff…

精选Java SSM 框架基础面试题

一、Spring面试题 1、Spring 在ssm中起什么作用&#xff1f; Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a;1、IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service层&#xff0c;se…

STM32 GPIO 详解

0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称&#xff1a;General Purpose Input Output&#xff0c;即通用输入输出端口&#xff0c;一般用来采集外部器件的信息或者控制外部器件工作&#xff0c;即输入输出 1.2 STM32 的 GPIO 特点 不同型号&#xff0…

SpringBatch从入门到实战(五):执行上下文和单步骤重启

一&#xff1a;执行上下文 1.1 Job Context 作业上下文 JobContext 绑定 JobExecution 执行对象&#xff0c;为Job作业执行提供执行环境(上下文)。 1.2 Step Context 步骤上下文 StepContext 绑定 StepExecution 执行对象&#xff0c;为Step步骤执行提供执行环境(上下文)。 …

【剑指offer专项突破版】栈篇——“C“

文章目录 前言一、后缀表达式题目分析思路分析代码 二、小行星碰撞题目分析思路分析代码 三、每日温度题目分析思路分析代码 四、直方图最大矩形面积题目分析思路分析代码 五、矩阵中最大的矩形题目分析思路分析代码 总结 前言 剑指offer专项突破版&#xff08;力扣官网&#x…

IBM不藏私:深刻解析量子计算机的突破和机遇

​ 巴伐利亚科学部长Markus Blume在莱布尼茨超级计算中心与Dieter Kranzlmlle&#xff08;左&#xff09;一起观看量子计算机的部分构件。&#xff08;图片来源&#xff1a;网络&#xff09; 关于量子计算机的研究已进行了数十年&#xff0c;目前还尚未生产一台能够掀起计算革命…

Vue全家桶(一):Vue基础+Vue-Cli+Vue组件化+过渡动画

目录 1.Vue概述1.1 认识Vue1.2 Vue的两核心1.3 Vue的初体验1.4 Vue的生命周期 2. Vue-CLI (Command Line Interface)3. Vue基本使用3.1 传统开发模式对比3.2 Vue.js引入3.3 Vue.js 案例分析3.3.1 实例参数el、data、methods的写法 4. Vue模板语法4.1 插值语法 {{xxx}}4.2 指令语…

vue3+ts:shims-vue.d.ts

一、本文引子 uniapp&#xff08;3.8.4.20230531&#xff09; vue3 ts vite 项目 在搭建这个base项目的时候出现红素波浪线如图&#xff0c;代码运行正常&#xff0c;但是看起来很难受&#xff0c;于是各种查找&#xff0c;能找到的资料很少&#xff0c;可能和我提问不够准…

【备战秋招】每日一题:4月23日美团春招第一题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第一题-申请奖学金 在线评测链接:P1245 题目内容 塔子哥是一个热爱学习的大学生&#xff0c;他的梦想是成为一名优秀的算法竞赛高手。为了实现自己的梦想&#xff0c;他需…

代理ip匿名原理及那些行业需要代理ip

互联网的高速发展&#xff0c;连带了代理ip也受到了更多人的使用&#xff0c;不同的行业都存在使用代理ip的情况&#xff0c;同时代理ip也以为匿名程度分成了高匿、普匿、透明代理&#xff0c;那么代理ip匿名的原理是什么呢&#xff1f;又有哪些行业需要代理ip呢&#xff1f;下…