OpenGL中建立VAO的流程

use*_*676 1 c++ opengl graphics vertex-array-object vao

我可以获得更全面/一般的描述吗?

我整个星期都在尝试研究这些东西,但我只涉及超级技术解释或示例。

有人可以解释一下这些 VAO 的总体流程或目标吗?也许概述一下在 OpenGL 中设置 VAO 的“分步”流程图?

我从来都不是一个通过例子学习的人……所以到目前为止,我在网上找到的所有东西都没有什么帮助。

Fra*_*cis 6

您的顶点缓冲区对象 (VBO) 包含顶点数据。您设置属性指针,指定如何访问和解释数据以绘制顶点 - 每个顶点有多少个组件,它们如何存储(例如 GL_FLOAT)等。

顶点数组对象(VAO)保存了所有这些属性。它们的目的是允许您设置这些属性一次,然后在需要使用它们时通过一次状态更改来恢复它们。

这样做的优点是您可以轻松设置多个状态并恢复它们 - 如果我想绘制一个立方体和一个三角形,这是两个不同的状态 - 我为每个状态创建一个 VAO,并且 VAO 为每个状态保存状态。当我想绘制立方体时,我只恢复立方体的状态。

设置

设置有四个步骤:

  1. 创建VAO
  2. 绑定VAO
  3. 设置状态
  4. 解绑VAO

创建 VAO 非常简单:

GLuint vao_name;
glGenVertexArrays(1, &vao_name);
Run Code Online (Sandbox Code Playgroud)

这将生成一个顶点数组,并将其名称存储在 vao_name 中。

创建 VAO 后,您需要绑定它:

glBindVertexArray(vao_name);
Run Code Online (Sandbox Code Playgroud)

现在,您对属性指针或元素数组缓冲区的绑定所做的任何更改都将被保存。这是对以下任意一项的调用:

  1. glVertexAttribPointer(...)
  2. glEnableVertexAttribArray(...)
  3. glDisableVertexAttribArray(...)
  4. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...)

每当您进行这些调用之一时,相应的状态都会保存在当前绑定的 VAO 中。当您稍后再次绑定 VAO 时,状态将恢复。

一旦您设置了状态,您就可以解除 VAO 的绑定。通过绑定 VAO 0 来完成此操作:

glBindVertexArrays(0);
Run Code Online (Sandbox Code Playgroud)

您还可以绑定不同的 VAO 并为其设置不同的状态。发生这种情况时,可以安全地更改属性指针,而不会破坏之前的状态。

绘画

当你想画一些东西时,你所要做的就是恢复 VAO:

glBindVertexArray(cube_vao)
glDrawArrays(GL_TRIANGLES, 0, 36);

glBindVertexArray(triangle_vao);
glDrawArrays(GL_TRIANGLES, 0, 3);

glBindVertexArray(0);                //Unbind the VAO
Run Code Online (Sandbox Code Playgroud)

编辑:

当我试图理解 VAO 时,这些答案对我有帮助: glVertexAttribPointer 覆盖glVertexAttribPointer 澄清何时应该调用 glVertexAttribPointer?

此外,一旦您了解了基础知识,OpenGL 规范就会很好地解释它: https: //www.opengl.org/registry/