OpenGL - glDrawElements与顶点数组对象

ben*_*ben 5 opengl vao

我需要帮助来看看他们之间的权衡.

  • 在我看来,glDrawElements()需要将索引数据"实时"作为参数.
  • 另一方面,如果我使用VAO,那么在启动期间我缓冲数据并且驱动程序可能决定将其放在GPU上,然后在渲染期间我只绑定 VAO并调用glDrawArrays().

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

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

BDL*_*BDL 5

这些信息确实有点难以找到,但也可以glDrawElements与VAO结合使用.然后,索引数据可以(但不必)由a提供ELEMENT_ARRAY_BUFFER.索引像往常一样工作,在顶点着色器中不需要做任何特殊操作.OpenGL确保已经在原始组装期间以正确的方式使用索引.

规范各国在本节10.3.10:

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

这基本上意味着,无论何时ELEMENT_ARRAY_BUFFER绑定,indices参数都用作此缓冲区的偏移量(0表示从头开始).当没有绑定这样的缓冲区时,索引指针指定索引数组的地址.

  • 由于问题是关于VAO,因此值得一提的是,"GL_ELEMENT_ARRAY_BUFFER"绑定是VAO状态的一部分.因此,您可以在VAO设置期间绑定缓冲区一次,并且不必在每次绘制调用之前再次显式绑定它.那将作为绑定VAO的一部分发生. (3认同)