Three.js。 MeshPhongMaterial具有称为“弥散”的制服。为什么不暴露它,也不能设置它?

时间:2019-03-23 15:39:40

标签: three.js

Three.js中,我正在密切关注MeshPhongMaterial的glsl来源。我注意到片段着色器依赖于名为uniform的{​​{1}}。但是,似乎没有任何设置方法。还有一个名为diffuse的{​​{1}}可以设置,并且确实可以改变看起来像漫反射颜色的颜色。嗯?

uniform是否以某种方式复制到color?谁能为我解开这个谜。

2 个答案:

答案 0 :(得分:1)

如果您查看或搜索the source,则会发现它是根据材料的color设置的

例如here

答案 1 :(得分:0)

MeshPhongMaterial不是ShaderMaterial的子类,即使它们都扩展了Material

内部WebGLRenderer跟踪/知道如何处理两种不同的事物:

  1. 任何 ShaderMaterial ,并穿着任何制服。。这意味着您可以使用MeshPhongMaterial来制作ShaderMaterial的精确副本,而不是的myMaterial.color中,您将有myMaterial.uniforms.color
  2. “内置”材料及其特性。对于这些,WebGLRenderer 知道这些材料具有的所有可能的特性。 Gman指出了代码在哪里发生(其中之一)。对于每种WebGLRenderer内部创建一个ShaderMaterial,但是它没有像其他任何此类材料那样处理其制服,而是手动跟踪并更新了所有内容。

内置材质没有什么意义,因为您可以使用吸气剂和设置器轻松将foo.bar传递到foo.uniforms.bar,而使渲染器仅处理着色器材质。

如果您真的想要为内置材质创建制服,则必须等待渲染器创建它们,然后可以使用material.onBeforeCompile = shader=>{}进入此过程(shader对象将包含制服)。