1
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

从上面的代码可以看出,有些教程在使用opengl之前就使用了这个。但是我正在关注的教程直接使用glGenBuffers方法并且效果很好。因此,我完全混淆了什么glGenVertexArrays。遗憾的是它定义了缓冲区的使用方式,但没有人说以何种方式使用。你能帮我理解吗?

4

3 回答 3

2

这取决于 OpenGL 版本。从具有 VAO 的 OpenGL-3核心配置文件开始是强制性的。为了与旧代码保持兼容,大多数开发人员只需将您在开始时在那里找到的代码段中添加一个 VAO 来捕获所有 VBO 状态。

于 2014-12-05T09:26:57.997 回答
2

顶点数组对象 (VAO) 是状态容器。

在旧版本的 GL 中,诸如glVertexAttribPointer (...)全局状态之类的东西。然而,从 GL3 开始,它们与 VAO 绑定在一起。

兼容性配置文件仍然允许您将顶点数组状态视为全局状态,但 3.1(没有GL_ARB_compatibility伪扩展)和 3.2+核心配置文件要求您在任何时候创建并具有非零 VAO 绑定,例如glVertexAttribPointer (...)glDrawArrays (...)。否则,您会遇到GL_INVALID_OPERATION错误。

于 2014-12-05T09:35:27.890 回答
2

从 openGL 3.2+ 开始,必须使用 VAO,除非您使用兼容性配置文件。

每个 VAO 存储索引缓冲区 (ELEMENT_ARRAY_BUFFER) 和每个属性绑定。

我的另一个答案中,我提供了存储在每个 VAO 中的一部分状态。

于 2014-12-05T09:35:42.643 回答