OpenGL - glDrawElements 与顶点数组对象
OpenGL - glDrawElements vs Vertex Array Objects
我需要帮助来了解它们之间的取舍。
- 在我看来
glDrawElements()
需要获取索引数据 "live" 作为参数。
- 另一方面,如果我使用 VAO,那么在启动期间我缓冲数据并且驱动程序可能决定将其放在 GPU 上,然后在渲染期间我只 绑定 VAO并致电
glDrawArrays()
.
有没有办法结合优势?我们也可以缓冲索引数据吗?
这在顶点着色器中看起来如何?它可以使用索引并在顶点位置数组中查找吗?
这个资料确实有点难找,但是glDrawElements
也可以结合一个VAO使用。然后索引数据可以(但不是必须)由 ELEMENT_ARRAY_BUFFER
提供。索引像往常一样工作,不需要在顶点着色器中做任何特殊的事情。 OpenGL 已经确保在原始装配期间以正确的方式使用索引。
spec 在第 10.3.10 节中对此进行了说明:
DrawElements, DrawRangeElements, and DrawElementsInstanced source
their indices from the buffer object whose name is bound to ELEMENT_-
ARRAY_BUFFER, using their indices parameters as offsets into the buffer object
这基本上意味着,无论何时绑定 ELEMENT_ARRAY_BUFFER
,indices 参数都用作此缓冲区的偏移量(0 表示从头开始)。当没有绑定这样的缓冲区时,索引指针指定索引数组的地址。
我需要帮助来了解它们之间的取舍。
- 在我看来
glDrawElements()
需要获取索引数据 "live" 作为参数。 - 另一方面,如果我使用 VAO,那么在启动期间我缓冲数据并且驱动程序可能决定将其放在 GPU 上,然后在渲染期间我只 绑定 VAO并致电
glDrawArrays()
.
有没有办法结合优势?我们也可以缓冲索引数据吗?
这在顶点着色器中看起来如何?它可以使用索引并在顶点位置数组中查找吗?
这个资料确实有点难找,但是glDrawElements
也可以结合一个VAO使用。然后索引数据可以(但不是必须)由 ELEMENT_ARRAY_BUFFER
提供。索引像往常一样工作,不需要在顶点着色器中做任何特殊的事情。 OpenGL 已经确保在原始装配期间以正确的方式使用索引。
spec 在第 10.3.10 节中对此进行了说明:
DrawElements, DrawRangeElements, and DrawElementsInstanced source their indices from the buffer object whose name is bound to ELEMENT_- ARRAY_BUFFER, using their indices parameters as offsets into the buffer object
这基本上意味着,无论何时绑定 ELEMENT_ARRAY_BUFFER
,indices 参数都用作此缓冲区的偏移量(0 表示从头开始)。当没有绑定这样的缓冲区时,索引指针指定索引数组的地址。