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 vs 顶点数组对象