代码之家  ›  专栏  ›  技术社区  ›  Barden

Threejs:使自定义着色器与标准渲染匹配

  •  3
  • Barden  · 技术社区  · 8 年前

    出于性能原因,我需要在场景中显示100个移动的四面体。在那里,我使用instancedbuffergeometry,这需要一个自定义着色器。

    场景中还包含具有规则几何体(非缓冲区)和一些灯光的对象(我准备了一个简化片段: https://jsfiddle.net/negan/xs3k1yz4/ ).

    我的问题是,四面体没有阴影,因此它们的照明似乎适合场景的其他部分。原因可能是我构建的原始着色器:

    <script id="vertexShader" type="x-shader/x-vertex">
    attribute vec3 offset;
    attribute vec4 color;
    varying vec4 vColor;
    varying vec3 vNormal;
    void main() {
    	vColor = color;
    	vNormal = normalMatrix * vec3(normal);
    	gl_Position = projectionMatrix *
    				modelViewMatrix *
    				vec4(position*1.0+offset,1.0);
    }
    </script>
    <script id="fragmentShader" type="x-shader/x-fragment">
    	varying vec4 vColor;
        varying vec3 vNormal;
    
    	void main() {  
    		float di = 0.4*dot(vNormal,normalize(vec3(1.,1.,0.)))+0.4*dot(vNormal,normalize(vec3(1.,0.,1.)));
    		di = di+0.2;
    		vec4 vColor2= vColor*vec4(1.0,1.,1.,0.2)*di;
    		gl_FragColor = vColor2;// adjust the alpha
    	}
    </script>

    感谢任何指点或帮助。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Andy Ray    8 年前

    Here's a gist of the full fragment and vertex shader source 三个人。js MeshPhongMaterial着色器,从r83开始。

    三js使用字符串连接系统构建着色器,因此通过查看三个着色器来确定着色器的源。js源代码几乎是不可能的。

    上述Gist是通过安装 shader editor Chrome extension ,将是三。js示例页面具有MeshPhongMaterial like this one 并使用着色器编辑器检查正在运行的着色器程序的完整源:

    shader editor source

    我将获取完整的源代码并手动添加您的逻辑,将您的计算结果添加到现有的 gl_FragColor = ...

    未来,我的工具 ShaderFrog 这将允许您自动添加任何三个。js着色器功能(灯光、骨骼、变形目标等)到任何自定义着色器。ShaderFrog已经可以自动将任何着色器组合在一起,但我还没有完成完全支持这三个功能所需的手动工作。

        2
  •  0
  •   Pawel    4 年前

    有一个InstancedMesh模块可供三人使用。它允许网格实例化而不使用着色器材质。它修补现有的材质。 https://github.com/pailhead/three-instanced-mesh