OpenGL - glDrawElements vs 顶点数组对象

Posted

技术标签:

【中文标题】OpenGL - glDrawElements vs 顶点数组对象【英文标题】:OpenGL - glDrawElements vs Vertex Array Objects 【发布时间】:2016-06-23 08:08:52 【问题描述】:

我需要帮助来了解它们之间的权衡。

在我看来,glDrawElements() 需要将索引数据“实时”作为参数。 另一方面,如果我使用 VAO,那么在启动期间我会缓冲数据,驱动程序可能会决定将其放在 GPU 上,然后在渲染期间我只绑定 VAO 并调用glDrawArrays() .

有没有办法结合优势?我们也可以缓冲索引数据吗?

那在顶点着色器中会是什么样子?是否可以使用索引在顶点位置数组中查找?

【问题讨论】:

【参考方案1】:

这个信息确实有点难找,但也可以将glDrawElements 与 VAO 结合使用。然后可以(但不是必须)由ELEMENT_ARRAY_BUFFER 提供索引数据。然后索引像往常一样工作,不必在顶点着色器中做任何特别的事情。 OpenGL 已确保在原始组装期间以正确的方式使用索引。

spec 在第 10.3.10 节中对此进行了说明:

DrawElements、DrawRangeElements 和 DrawElementsInstanced 源 它们的索引来自名称绑定到 ELEMENT_- 的缓冲区对象 ARRAY_BUFFER,使用它们的索引参数作为缓冲区对象的偏移量

这基本上意味着,每当绑定 ELEMENT_ARRAY_BUFFER 时,indices 参数将用作此缓冲区的偏移量(0 表示从头开始)。当没有绑定这样的缓冲区时,索引指针指定索引数组的地址。

【讨论】:

由于问题是关于 VAO,还值得一提的是 GL_ELEMENT_ARRAY_BUFFER 绑定是 VAO 状态的一部分。因此,您可以在 VAO 设置期间绑定一次缓冲区,而不必在每次绘制调用之前再次显式绑定它。这将作为绑定 VAO 的一部分发生。

以上是关于OpenGL - glDrawElements vs 顶点数组对象的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES - glDrawElements - 无法理解索引

OpenGL glDrawElements

glDrawElement 的 OpenGL 渲染问题

OpenGL - glDrawElements vs 顶点数组对象

OpenGL- glDrawElements 只绘制第一个元素

OpenGL glDrawElements 没有颜色