我想绘制许多四边形,每边都有纹理。如果我使用drawElements并且只使用8个顶点我的纹理坐标搞砸了,我明白为什么。要解决这个问题,我必须指定24个顶点。但是现在drawElements不再比drawArrays有任何好处,或者它呢?
drawArrays:36个顶点* 3个值= 108个值
drawElements:24个顶点* 3个值+ 36个索引= 108个值以及
显然,如果我不关心纹理坐标或法线,那就是:
drawElements:8个顶点* 3个值+ 36个索引= 60个值
但我没有得到四核的性能提升。如果我的对象的面不是矩形,而是类似扁平的星星,那么共享更多顶点的drawElements将再次值得。
我错过了什么或者我可以坚持使用drawArrays吗?
这个问题类似于: webgl, texture coordinates and obj
答案 0 :(得分:1)
对于每侧都有唯一法线的四边形,您不会看到使用gl.drawElements
有任何好处。实际上它可能会稍微慢一点,因为你必须绑定索引,因为gl.drawArrays
情况下没有间接级别。
大多数3D可能不仅仅是具有简单面孔的立方体。球体,人物,植物,动物等有机物,地形(山丘)之类的东西,甚至像柱子(圆柱体)这样的几何物通常共享许多顶点。在这些情况下,使用gl.drawElements
是有意义的,因为它的数据较少,而且可能更快。
如果你想要最佳速度,你应该arrange the vertices so they are cache friendly。
答案 1 :(得分:0)
By Quads,我希望你真的是指Triangle Strips?特别是因为这是标记的WebGL。
计算价值数量的这一切让我摸不着头脑。你不是在比较这里的东西。您的元素数组可能包含8位(不执行此操作,因为它不是硬件),16位或32位无符号整数,而顶点位置通常是2-4个浮点(32位)标量。显然,每个索引2个字节的每个顶点位置小于12个字节;即使你考虑了"值的数量" 2 < 12/3 强>
glDrawElements (...)
并不一定能为您带来性能提升。关于它唯一的原因是你可以重复使用顶点来避免多次在同一个顶点上运行顶点着色器(如果 相同的 顶点多次出现在可以使用缓存的变换值的输入顶点列表。但是,有一些原始类型已经隐式共享顶点,例如Triangle Strips,并且您不需要索引数组来利用它们的行为。