OpenGL - glDrawElements 与顶点数组对象

OpenGL - glDrawElements vs Vertex Array Objects

我需要帮助来了解它们之间的取舍。

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

这在顶点着色器中看起来如何?它可以使用索引并在顶点位置数组中查找吗?

这个资料确实有点难找,但是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 表示从头开始)。当没有绑定这样的缓冲区时,索引指针指定索引数组的地址。