OpenGL - glDrawElements与顶点数组对象(VAO)

5

我需要帮助来看到它们之间的权衡。

  • 我认为glDrawElements()需要将索引数据作为参数“实时”获取。
  • 另一方面,如果使用VAOs,则在启动期间缓冲数据,并且驱动程序可能决定将其放置在GPU上,在渲染期间仅绑定 VAO 并调用 glDrawArrays()

没有方式可以结合各自的优点吗?我们能否也缓冲索引数据呢?

那么在顶点着色器中会是什么样子呢?它能够使用索引并在顶点位置数组中查找吗?

1个回答

5
这些信息有点难找,但是可以在VAO中结合使用glDrawElements。索引数据可以(但不一定)由ELEMENT_ARRAY_BUFFER提供。索引工作与通常相同,在顶点着色器中不需要做任何特殊处理。OpenGL已确保在原始装配期间正确使用了索引,因此无需做任何特殊操作。 规范第10.3.10节中如下说明:

DrawElements、DrawRangeElements和DrawElementsInstanced从名为ELEMENT_-ARRAY_BUFFER的缓冲对象中获取它们的索引,并使用其索引参数作为缓冲对象的偏移量

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

3
由于问题涉及VAOs,值得一提的是GL_ELEMENT_ARRAY_BUFFER绑定是VAO状态的一部分。因此,在设置VAO期间可以绑定缓冲区一次,而不必在每次绘制调用之前显式重新绑定它。这将作为绑定VAO的一部分自动发生。 - Reto Koradi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接