我想弄清楚如何正确使用Three.js'内置的ShaderChunk
s用于照明和雾等,我想好的第一步是复制其中一个ShaderLib
着色器的设置。因此,要开始我用:如何为Threejs着色器组装适当的制服?
customMaterial = new ShaderMaterial({
lights: true,
uniforms: UniformsUtils.merge([
UniformsLib.common,
UniformsLib.specularmap,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive: { value: new Color(0x000000) },
diffuse: { value: new Color(1,1,1) }
}
]),
vertexShader: document.getElementById("vertexShader").textContent,
fragmentShader: document.getElementById("fragmentShader").textContent
})
当着色器代码仅仅是直接从meshlambert_vert.glsl和meshlambert_frag.glsl,而且部分复制有基于this entry in the ShaderLib
不过,我使我的测试场景从两个不同照相机/渲染器,我马上注意到了一个问题。对于此应用的对象,更改一个摄像机的透视图会更改第二个摄像机的照明角度。
我认为这是由于这些UniformLib
对象被其他地方引用?
我不知道我应该通过这里,而不是为什么这不起作用,但标准材料。我想我正在跳过一步,但我不明白它可能是什么。
这里是一个codepen,我尽可能地隔离了问题。现在它几乎是ShaderLib
来源的直接副本。在这一点上,我认为这是一个通过参考,它应该是一个副本,在WebGLRenderer
内的某处。 https://codepen.io/cl4ws0n/pen/dVewdZ
无论它的价值如何,我也尝试添加第二个场景,并在它们之间移动对象。这并没有解决它,也没有单独的对象在单独的场景共享材料。
请删除与您的问题无关的活动示例中的_everything_并解释我们应该看到的内容。 – WestLangley
@WestLangley好吧,我做到了,更新了我的链接。只是现在的必需品。请注意,当右侧的摄像机角度发生变化时,左侧图像中心立方体的照明是否错误。 –
第二个盒子和LambertMaterial可以被移除。制服应该被克隆,以保证它们是唯一的:“制服:UniformsUtils.clone(shader.uniforms),',但这不是问题,因为你只用了一次材质。需要两个渲染器来复制问题吗? – WestLangley