2013-03-24 24 views
3

正如标题所说,我想重复使用给定的ShaderMaterial用于不同的网格,但为每个网格使用不同的制服集合(实际上,某些制服可能会在网格之间变化,但不一定全部):是否有可能?Three.js,在网格之间共享ShaderMaterial,但使用不同的统一集合

在这种情况下,我认为必须为每个网格物体创建一个完整的ShaderMaterial,这个想法似乎是浪费资源,这个想法是要有一个顶点/片段着色器程序,但要通过不同的制服来配置它,取决于网格。如果我为每个网格物体创建一个新的ShaderMaterial,我将最终产生大量重复(顶点+碎片程序+ Material/ShaderMaterial类的所有其他数据成员)。

如果引擎在绘制网格之前能够调用回调,我可以更改制服并实现我想要做的事情。另一种可能性是有一个“LiteShaderMaterial”,它将持有一个指向共享ShaderMaterial +的指针,只有我的网格的特定制服。

请注意,我的问题与这一个Many meshes with the same geometry and material, can I change their colors?有关,但仍然不同,因为我最关心的是资源浪费 - 性能方面我不认为在使用多个ShaderMaterial或一个因为引擎应该足够聪明,以便注意所有材料具有相同的程序,并且不会将它们重新发送到gfx卡。

由于

回答

5

当克隆ShaderMaterial,属性和顶点/片段程序通过参考复制。只有制服被价值复制,这​​就是你想要的。

这应该有效地工作。

您可以通过创建ShaderMaterial然后使用ShaderMaterial.clone()克隆每个网格来证明。然后分配每个材料唯一的统一值。

在控制台中键入“render.info”。它应该显示1个程序。

three.js所r.64

+0

谢谢您的回答,但正如我上面说的,我真的不通过性能,但受资源,而不是关注:对于例如,顶点/片断程序将在每个被复制材质以及ShaderMaterial/Material的所有其他数据成员。今天我们所拥有的所有内存可能不是一个大问题,但是由于当我有一个(或者只有几个不同的)顶点/片段着色器时,我有成千上万个网格对我来说感觉不对劲,所以不得不创建数以千计的ShaderMaterial。我需要的只是改变这些程序的输入。 – Popov 2013-03-24 18:45:15

+1

不正确。克隆时,通过引用复制顶点/片段程序和属性。只有制服被价值复制,这​​就是你想要的。 – WestLangley 2013-03-24 19:02:46

+0

顶点和片段着色器变量是ShaderMaterial类中的字符串,因此在克隆材质时,每次都会复制整个程序。另外,当我创建一个新材质时,我得到的所有其他数据成员都使用与我最初着色器相同的值进行复制,因为这些值不会更改(并且大多数成员不会用于所有)。我想我需要我上面所描述的,一个lite ShaderMaterial,我将为每个网格实例化,并且只保存统一数组+对“主”着色器的引用。 – Popov 2013-03-24 19:31:59

相关问题