在Three.js
中,我正在密切关注MeshPhongMaterial的glsl
来源。我注意到片段着色器依赖于名为uniform
的{{1}}。但是,似乎没有任何设置方法。还有一个名为diffuse
的{{1}}可以设置,并且确实可以改变看起来像漫反射颜色的颜色。嗯?
uniform
是否以某种方式复制到color
?谁能为我解开这个谜。
答案 0 :(得分:1)
如果您查看或搜索the source,则会发现它是根据材料的color
设置的
例如here
答案 1 :(得分:0)
MeshPhongMaterial
不是ShaderMaterial
的子类,即使它们都扩展了Material
。
内部WebGLRenderer
跟踪/知道如何处理两种不同的事物:
ShaderMaterial
,并穿着任何制服。。这意味着您可以使用MeshPhongMaterial
来制作ShaderMaterial
的精确副本,而不是的myMaterial.color
中,您将有myMaterial.uniforms.color
。 WebGLRenderer
知道这些材料具有的所有可能的特性。 Gman指出了代码在哪里发生(其中之一)。对于每种WebGLRenderer
内部创建一个ShaderMaterial
,但是它没有像其他任何此类材料那样处理其制服,而是手动跟踪并更新了所有内容。 内置材质没有什么意义,因为您可以使用吸气剂和设置器轻松将foo.bar
传递到foo.uniforms.bar
,而使渲染器仅处理着色器材质。
如果您真的想要为内置材质创建制服,则必须等待渲染器创建它们,然后可以使用material.onBeforeCompile = shader=>{}
进入此过程(shader
对象将包含制服)。