在OpenGL中设置VAO的过程

时间:2015-02-02 04:05:12

标签: c++ opengl graphics vao vertex-array-object

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

我一直在努力研究这些事情,但我只是进入超级技术解释或例子。

有人可以解释这些VAO的整体过程或目标吗?也许勾勒出一些用于在OpenGL中设置VAO的“逐步”流程图?

我从来就不是一个通过例子学习的人......所以我在网上找到的所有东西到目前为止都没有用。

4 个答案:

答案 0 :(得分:3)

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

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

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

<强>设置

安装程序有四个步骤:

  1. 创建VAO
  2. 绑定VAO
  3. 设置状态
  4. 取消绑定VAO
  5. 创建VAO非常简单:

    GLuint vao_name;
    glGenVertexArrays(1, &vao_name);
    

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

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

    glBindVertexArray(vao_name);
    

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

    1. glVertexAttribPointer(...)
    2. glEnableVertexAttribArray(...)
    3. glDisableVertexAttribArray(...)
    4. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...)
    5. 每当您进行其中一个调用时,相应的状态将保存在当前绑定的VAO中。当您稍后再次绑定VAO时,状态将恢复。

      设置状态后,您可以取消绑定VAO。通过绑定VAO 0来执行此操作:

      glBindVertexArrays(0);
      

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

      <强>图纸

      当你想绘制一些东西时,你需要做的就是恢复VAO:

      glBindVertexArray(cube_vao)
      glDrawArrays(GL_TRIANGLES, 0, 36);
      
      glBindVertexArray(triangle_vao);
      glDrawArrays(GL_TRIANGLES, 0, 3);
      
      glBindVertexArray(0);                //Unbind the VAO
      

      编辑:

      当我试图理解VAO时,这些答案帮助了我: glVertexAttribPointer overwriteglVertexAttribPointer clarificationWhen should glVertexAttribPointer be called?

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

答案 1 :(得分:1)

VAO保存有关如何从VBO读取属性的所有信息。

这包括每个属性,它所在的VBO;偏移量,步幅,如何编码(int,float,normalized或not),每个属性有多少个值。换句话说,glVertexAttribPointer的参数(以及调用时绑定的GL_ARRAY_BUFFER。

它还包含保存索引的元素数组缓冲区。

答案 2 :(得分:0)

对于VAO是什么,请参阅@ ratchet-freak的回答。

对于VAO的目标,通过允许单个状态更改来设置所有顶点属性绑定来提高性能,这不仅意味着更少的函数调用,而且还有更多的OpenGL机会实施以优化整个州的状态。

答案 3 :(得分:0)

对于VAO来说,了解VBO和Shader是一个先决条件。 VAO提供了一种“预定义”顶点数据及其属性的方法。

理解的一种方法是用VBO绘制,然后用VAO绘制。您会注意到它与使用VBO进行绘制类似,不同之处在于它首先“保存”在VAO中供以后使用。随后,VAO处于活动状态以实际绘制已保存的状态。

请参阅VBO, Shader, VAO以获得一个相当不错的示例。