我需要帮助来看到它们之间的权衡。
- 我认为
glDrawElements()
需要将索引数据作为参数“实时”获取。 - 另一方面,如果使用VAOs,则在启动期间缓冲数据,并且驱动程序可能决定将其放置在GPU上,在渲染期间仅绑定 VAO 并调用
glDrawArrays()
。
没有方式可以结合各自的优点吗?我们能否也缓冲索引数据呢?
那么在顶点着色器中会是什么样子呢?它能够使用索引并在顶点位置数组中查找吗?
glDrawElements
。索引数据可以(但不一定)由ELEMENT_ARRAY_BUFFER
提供。索引工作与通常相同,在顶点着色器中不需要做任何特殊处理。OpenGL已确保在原始装配期间正确使用了索引,因此无需做任何特殊操作。
规范第10.3.10节中如下说明:
这基本上意味着,只要绑定了DrawElements、DrawRangeElements和DrawElementsInstanced从名为ELEMENT_-ARRAY_BUFFER的缓冲对象中获取它们的索引,并使用其索引参数作为缓冲对象的偏移量
ELEMENT_ARRAY_BUFFER
,索引参数就会被用作该缓冲区的偏移量(0表示从开头开始)。当没有绑定这样的缓冲区时,索引指针指定索引数组的地址。
GL_ELEMENT_ARRAY_BUFFER
绑定是VAO状态的一部分。因此,在设置VAO期间可以绑定缓冲区一次,而不必在每次绘制调用之前显式重新绑定它。这将作为绑定VAO的一部分自动发生。 - Reto Koradi