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