Three.js,在网格之间共享ShaderMaterial但具有不同的统一集

Pop*_*pov 4 three.js

正如标题所说,我想重复使用给定的ShaderMaterial用于不同的网格,但每个网格使用不同的制服集(实际上,一些制服可能在网格之间有所不同,但不一定都是不同的):是否可能?

在这种情况下,我必须为每个网格创建一个完整的ShaderMaterial似乎是浪费资源,这个想法是拥有一个顶点/片段着色器程序,但是通过不同的制服配置它,其值会根据网格而改变.如果我为每个网格创建一个新的ShaderMaterial,我将最终得到大量的重复(顶点+片段程序+ Material/ShaderMaterial类的所有其他数据成员).

如果引擎能够在绘制网格之前调用回调,我可以更改制服并实现我想要做的事情.另一种可能性是拥有一个"LiteShaderMaterial",它可以保存指向共享ShaderMaterial的指针+仅包含我网格的特定制服.

请注意,我的问题与此问题有关.许多具有相同几何和材质的网格,我可以更改它们的颜色吗?但仍然不同,因为我最担心的是资源的浪费 - 性能明智我不认为在拥有多个ShaderMaterial或单个ShaderMaterial之间会有很大不同,因为引擎应该足够聪明,注意所有材料具有相同的程序,不会重新发送到gfx卡.

谢谢

Wes*_*ley 8

克隆a时ShaderMaterial,属性和顶点/片段程序通过引用复制.只有制服按值复制,这​​就是你想要的.

这应该有效.

你可以通过创建一个ShaderMaterial然后使用ShaderMaterial.clone()克隆每个网格来证明它.然后为每个材质指定唯一的均匀值.

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

three.js r.64