OpenGL ES:我应该为 TRIANGLE_STRIP 数组使用 DrawElements 吗?

OpenGL ES: Should I use DrawElements for a TRIANGLE_STRIP array?

我正在尝试绘制一组简单的三角形。它们都是相连的,所以我目前正在使用 DrawArrays 和 GL_TRIANGLE_STRIP。但是,在检查 XCode 探查器时,它建议改用 DrawElements 和索引数组。

我真的应该这样做吗?我注意到 DrawElements 也有 TRIANGLE_STRIP 的选项,但我没有看到优势,因为当我使用 glDrawArrays 时没有任何重复的顶点。

这是我正在绘制的三角形图:

如您所见,我使用的是 TRIANGLE_STRIP,因此没有重复,那么索引它有什么好处吗?

通常 glDrawElements 更快,但在您的情况下(只有两行顶点)它不会影响性能, glDrawElements 可能会更慢,因为您还必须处理索引缓冲区。

在其他一些情况下,如果你有三行或更多行的顶点,你将开始有顶点重复,你应该使用 glDrawElements 并索引你的顶点缓冲区。索引的优点是:

  • 不仅您的 3D 模型更小,占用的内存更少,而且加载到显卡内存中的速度也更快。所以更少的内存意味着更少的内存传输。

  • 如果您的着色器很复杂并且有太多操作,索引可能会对性能产生积极影响。事实上,如果您正在索引顶点,则无需多次重新计算同一顶点的结果。结果计算一次,缓存并在另一个索引指向同一顶点时再次使用。

  • 当你有一个可变形的物体(即顶点的位置由于物理碰撞而改变)时,索引会有所帮助。假设您没有索引,您将为每个三角形重复相同的顶点(位置)。所以如果你想改变顶点的位置来模拟碰撞,你将不得不更新所有三角形的顶点位置。但是,如果您索引顶点缓冲区,则只需更改顶点的位置并保持索引缓冲区相同。