了解顶点数组对象(glGenVertexArrays)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解顶点数组对象(glGenVertexArrays)相关的知识,希望对你有一定的参考价值。

我对使用以下方法生成/创建顶点数组对象(VAO)的观点感到困惑:

glGenVertexArrays(GLsizei n, GLuint *arrays);

glBindVertexArray(GLuint);

因为我仍然可以创建一个缓冲对象,例如顶点,并用glVertexAttribPointerglEnableVertexAttribArray描述该缓冲对象,而不用创建VAO。

我的问题是,如果你不必实际创建VAO来描述缓冲区对象中的数据,那么为什么像OpenGL SuperBible 5ed这样的源包含在创建VBO时创建VAO的调用?它们仅用于我尚未发现的更高级的主题,我完全糊涂了吗?

我在VBO上阅读wikipedias条目时首次遇到这个问题,他们的示例代码不包含对glGenVertexArrays()的调用,但他们仍然使用glVertexAttribPointer().Wiki VBO entry描述数据 - Example where VAOs are created for what reason?

答案

性能改进。

在许多情况下,在主机上设置属性需要大量的API调用,并且在实现中需要进行大量的验证。

完成所有这些操作,并使用VAO允许该工作摊销。

例如,参见Graham Sellers的analysis的实际数据。

另一答案

假设您正在构建一个需要三个VBO的对象(不同的数据用于着色,可能是位置,法线和一些花式效果参数)。每次绘制此对象时,都必须绑定所有这些VBO并设置任何其他参数。如果使用VAO,则只需使用一次调用(绑定顶点数组),这将为特定对象设置整个环境。

另一答案

答案并不像你想象的那么难。把它想象成一个有趣的比喻; VertexArrayObject是老板,它管理着几个VetexBufferObjects的工作人员。

以上是关于了解顶点数组对象(glGenVertexArrays)的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 顶点数组/缓冲区对象

带着色器的顶点缓冲区对象/顶点数组对象

顶点数组对象是上下文的一部分吗?

OpenGL复制顶点缓冲区对象

OpenGL更新顶点数组/缓冲区

了解现代 OpenGL 中的代码绘制 .obj 并设置不同的位置