我目前正在学习WebGL,并且正在使用很多相同的多维数据集但使用不同的转换渲染场景。
我相信我有2种选择可以选择这些选项;
缓冲单个多维数据集,使用uniform4fv进行转换,然后为每个多维数据集将其重新发送(到顶点着色器)。
缓冲所有我的多维数据集(使用translate硬编码的顶点)。
我的问题是在哪种情况下哪种选择更可取?-我认为第一种选择更可取,但这取决于开销或更新统一变量。
正如WaclawJasper所说,有很多折衷方案。
在WebGL中执行操作的一般方法是每个对象一个绘画调用(您的第一个方法)。
另一种是使用实例化绘图使用ANGLE_instanced_arrays
。在这种方法中,您的翻译将存储在缓冲区中。您只需为每个实例更新一次缓冲区翻译(与第二种方法中的每个顶点更新)。该方法假定所有实例都是相同的。
如果您的几何体恰好是混合在一起的(立方体+球体+金字塔),那么另一种方法是将方向数据放入纹理中。通过为每个顶点指定一个instanceId,您可以使用它来计算该实例的数据在纹理中的位置。在这种情况下,您将像以前的方法一样,为每个实例更新一个方向。只是您要更新纹理而不是缓冲区。如果硬件支持从浮点纹理(OES_texture_float
)读取AFAICT目前大多数硬件所做的操作,则此方法非常简单。
作为在纹理中存储方向的示例,Three.js可选地在纹理中存储骨骼矩阵以进行蒙皮网格渲染,以避开有限数量的制服。
请注意,使用纹理还可以将顶点数据放入纹理中。然后,缓冲区将仅包含顶点索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句