opengl-es - webgl 中的drawElements 与drawArrays

标签 opengl-es webgl

如果我不打算共享任何顶点,那么使用drawElements而不是drawArrays是否有意义?

如果我理解正确的话,由于索引缓冲区的 uInt16 限制(在 webgl 中),如果索引数组超过 ~65k 元素,则使用 drawElements 我必须使用多个绘制调用。

作为一条经验法则,可以说:

没有共享顶点,请使用drawArrays,因为它只是一个大的drawCall。

如果共享顶点,请使用drawElements,因为可以节省GPU带宽,并且如果需要多个drawcall,这也会比drawArrays获得更好的性能?

最佳答案

glDrawElements() 的优点理论上很简单:您使用更少的顶点,并且可以使用后 T&L 缓存。缺点是您必须使用索引数组,并且缓存局部性可能会更差。

由于后 T&L 缓存的大小会根据(例如)您的显卡的年龄而变化,因此比较变得复杂。较新的卡可能有巨大的缓存,较旧的卡可能有较小的缓存。

但是,如果您没有在图元之间共享任何顶点,那么 glDrawElements() 就没有任何优势,您应该使用glDrawArrays()。

在更复杂的场景中,当您将额外绘制调用(使用 glDrawElements())的成本与额外顶点数据和更多顶点着色器调用(使用 glDrawArrays( )),我想分析一下。

关于opengl-es - webgl 中的drawElements 与drawArrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075739/

相关文章:

android - 绘制过多元素时 glDrawArrays() 出现段错误

macos - 为什么 WebGL 和 Cocoa 之间的 GL_ALIASED_POINT_SIZE 不同?

webgl - 如何修改此 WebGL 片段着色器以增加高光的亮度并减少

three.js - Threejs 按 x 和 z 进行的旋转单独工作,但一起失败

opengl-es - 使用 webgl 的粒子系统

iphone - glScissor 帮助 (iPhone OpenGL ES)

java - 安卓。如何沿对象所面对的方向移动对象(使用 Vector3 和四元数)

android - 将数据从一个纹理复制到另一个 - opengl

unit-testing - 有没有办法在 headless 浏览器中为 WebGL webapp 运行单元测试

javascript - 为什么 gl.readPixels() 不起作用?