use*_*676 1 c++ opengl graphics vertex-array-object vao
我可以获得更全面/一般的描述吗?
我整个星期都在尝试研究这些东西,但我只涉及超级技术解释或示例。
有人可以解释一下这些 VAO 的总体流程或目标吗?也许概述一下在 OpenGL 中设置 VAO 的“分步”流程图?
我从来都不是一个通过例子学习的人……所以到目前为止,我在网上找到的所有东西都没有什么帮助。
您的顶点缓冲区对象 (VBO) 包含顶点数据。您设置属性指针,指定如何访问和解释数据以绘制顶点 - 每个顶点有多少个组件,它们如何存储(例如 GL_FLOAT)等。
顶点数组对象(VAO)保存了所有这些属性。它们的目的是允许您设置这些属性一次,然后在需要使用它们时通过一次状态更改来恢复它们。
这样做的优点是您可以轻松设置多个状态并恢复它们 - 如果我想绘制一个立方体和一个三角形,这是两个不同的状态 - 我为每个状态创建一个 VAO,并且 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)
现在,您对属性指针或元素数组缓冲区的绑定所做的任何更改都将被保存。这是对以下任意一项的调用:
每当您进行这些调用之一时,相应的状态都会保存在当前绑定的 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/
| 归档时间: |
|
| 查看次数: |
3414 次 |
| 最近记录: |