webgl 中的 drawElements 与 drawArrays

drawElements vs drawArrays in webgl

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

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

根据经验,可以这么说:

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

如果共享顶点,请使用 drawElements,因为可以节省 GPU 带宽,并且如果需要多个绘制调用,这将导致比 drawArrays 更好的性能?

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

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

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

在更复杂的场景中,当您比较额外绘制调用的成本(glDrawElements())与额外顶点数据和更多顶点着色器调用(glDrawArrays())的成本时,我想要个人资料。