GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
从上面的代码中可以看到,一些教程在使用opengl之前使用了这个。但是我正在学习的一个教程,直接使用了glGenBuffers
方法,而且效果很好。因此,我完全搞不清楚什么是glGenVertexArrays
。令人遗憾的是,它定义了缓冲区的使用方式,但没有人说以什么方式使用。你能帮我理解吗?
这取决于OpenGL版本。从OpenGL-3核心配置文件开始,必须具有VAO。为了保持与旧代码的兼容性,大多数开发人员只需在开始时找到代码片段,即可使用VAO来捕获所有VBO状态。
在GL的旧版本中,像< code > glVertexAttribPointer(...)是全局状态。然而,从GL3开始,他们开始与VAOs绑定。
兼容性配置文件仍然允许您将顶点数组状态视为全局状态,但是3.1(没有GL_ARB_compatibility
伪扩展)和3.2核心配置文件要求您在进行调用时创建并具有非零VAO绑定,例如glVertex AttribPointer(…)
或glDrawArray(…)
。否则,您最终会出现GL_INVALID_OPERATION
错误。
从openGL 3.2开始,除非您使用兼容性配置文件,否则必须使用VAO。
每个VAO存储索引缓冲区(ELEMENT_ARRAY_BUFFER)和每个属性的绑定。
在我的另一个回答中,我提供了存储在每个VAO中的状态的一部分。