glDrawArrays
和glDrawElements
,哪种方法最好?它们有什么区别吗?glDrawArrays
和glDrawElements
,哪种方法最好?它们有什么区别吗?对于两者,您都需要向OpenGL传递包含顶点数据的缓冲区。
glDrawArrays基本上是“使用我之前提供的数据,绘制这个连续范围的顶点”。
使用glDrawElements,您会传递一个包含要绘制顶点索引的缓冲区。
我的建议是使用glDrawElements。
已被接受的答案略有过时。在Jorn Horstmann的回答中跟随文档链接OpenGL ES Programming Guide for iOS,苹果描述了如何使用"退化三角形技巧"与DrawElements一起使用,从而获得最佳效果。
通过使用DrawArrays节省一些索引的小优惠并不值得你通过将所有数据组合成单个GL调用DrawElements来获得节省。 (您可以使用DrawArrays将所有内容组合在一起,但是任何“浪费的元素”都会浪费顶点,这些顶点比索引大得多,并且需要更多的渲染时间。)
这也意味着您无需仔细考虑所有模型,以确定它们中的大多数是否可以渲染为最少数量的条带,或者它们是否太复杂。一个统一的解决方案,处理所有事情。(但请尽可能地组织条带,以最小化发送的数据,并最大程度地增加GPU重用最近缓存的顶点计算的可能性。)
BEST: 一次使用 GL_TRIANGLE_STRIP 的 DrawElements 调用,包含所有每帧更改的数据。
实际上,您可以退化三角形带,以创建连续的带,这样您就不必在使用glDrawArray时将其拆分。
我一直在使用glDrawElements和GL_TRIANGLES,但考虑改用glDrawArray与GL_TRIANGLE_STRIP。这样就不需要创建索引向量。
是否有人更了解在帖子中提到的顶点高速缓存事物?考虑glDrawElements/GL_TRIANGLE与glDrawArray/GL_TRIANGLE_STRIP之间的性能差异。