GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
从上面的代码可以看出,有些教程在使用opengl之前就使用了这个。但是我正在关注的教程直接使用glGenBuffers
方法并且效果很好。因此,我完全混淆了什么glGenVertexArrays
。遗憾的是它定义了缓冲区的使用方式,但没有人说以何种方式使用。你能帮我理解吗?
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
从上面的代码可以看出,有些教程在使用opengl之前就使用了这个。但是我正在关注的教程直接使用glGenBuffers
方法并且效果很好。因此,我完全混淆了什么glGenVertexArrays
。遗憾的是它定义了缓冲区的使用方式,但没有人说以何种方式使用。你能帮我理解吗?
这取决于 OpenGL 版本。从具有 VAO 的 OpenGL-3核心配置文件开始是强制性的。为了与旧代码保持兼容,大多数开发人员只需将您在开始时在那里找到的代码段中添加一个 VAO 来捕获所有 VBO 状态。
在旧版本的 GL 中,诸如glVertexAttribPointer (...)
全局状态之类的东西。然而,从 GL3 开始,它们与 VAO 绑定在一起。
兼容性配置文件仍然允许您将顶点数组状态视为全局状态,但 3.1(没有GL_ARB_compatibility
伪扩展)和 3.2+核心配置文件要求您在任何时候创建并具有非零 VAO 绑定,例如glVertexAttribPointer (...)
或glDrawArrays (...)
。否则,您会遇到GL_INVALID_OPERATION
错误。
从 openGL 3.2+ 开始,必须使用 VAO,除非您使用兼容性配置文件。
每个 VAO 存储索引缓冲区 (ELEMENT_ARRAY_BUFFER) 和每个属性绑定。
在我的另一个答案中,我提供了存储在每个 VAO 中的一部分状态。