发布
社区首页 >问答首页 >如何使用THREE.ShaderLib创建自定义着色器

如何使用THREE.ShaderLib创建自定义着色器
EN

Stack Overflow用户
提问于 2018-03-02 07:35:23
回答 1查看 1.9K关注 0票数 2

我一直在尝试学习THREEJS着色器材质。到目前为止,我了解了uniforms、vertexShader和fragmentShader在投影和着色glsl和webgl世界中的顶点和碎片方面所起的作用。我一直在努力寻找一些使用THREE.ShaderLib扩展THREEJS的ShaderMaterial的好例子。

假设我想扩展一个标准的threejs材质(THREE.ShaderLib' standard ')来编写envmap纹理,这是可能的吗?或者我绝对有必要从头开始写所有的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-02 08:31:14

着色器只是字符串,这取决于您如何处理它们以及如何获取它们。话虽如此,three.js有许多工具可以帮助您更好地构建它们。

在最高级别,有一种THREE.Material形式的抽象。其中描述抽象属性,三个配置引擎盖下的着色器。

代码语言:javascript
代码运行次数:0
复制
//no shaders involved
var redPlastic = new THREE.MeshStandardMaterial({
   color: 'red',
   roughness: notVeryRough
}) 

ShaderMaterial希望您编写原始的GLSL,但仍然包含一些否则您必须手动完成的内容。所以“从头开始写作”不是完全正确的。使用RawShaderMaterial,您可以从头开始编写所有内容。THREE.ShaderMaterial

代码语言:javascript
代码运行次数:0
复制
varying vec2 vUv;
void main(){
  vUv = uv; // <- magic! where does uv come from?
  vec4 worldPosition = modelMatrix * vec4( position, 1.); // <- more magic! where do modelMatrix and position come from?
  gl_Position = projectionMatrix * viewMatrix * worldPosition; // more!
}

在运行时,当三个名称空间被编译并包含在一个页面上时,这三个名称空间就有了THREE.ShaderChunk字典。这些是GLSL的各种命名片段,所有的材料都是从这些片段中构建出来的。

可以从这些片段的源文件中复制它们,并将它们粘贴到您自己的着色器文件或字符串中。

您可以使用字符串模板来编写它:

代码语言:javascript
代码运行次数:0
复制
`${THREE.ShaderChunk.some_chunk}
 void main(){
 ...
 ${anotherChunk}
 gl_Position = ...
`

但是如果你想扩展内置的材质,有一个叫做onBeforeCompile的材质的(IMHO buggy and wonky:)功能。这样,您就可以将回调传递给任何内置材质,并在编译之前获取着色器对象。在这里,你可以注入你自己的glsl,交换出块或任何你能想到的对字符串做的事情。

为了使用它,你需要熟悉从https://github.com/mrdoob/three.js/tree/dev/src/renderers/shaders/ShaderChunk构建的着色器的结构。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49060488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档