32

我对生成/创建顶点数组对象(VAO)的观点感到困惑:

glGenVertexArrays(GLsizei n, GLuint *arrays);

glBindVertexArray(GLuint);

因为我仍然可以创建一个缓冲区对象,比如顶点,并在创建glVertexAttribPointerglEnableVertexAttribArray不创建 VAO 的情况下描述该缓冲区对象。

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

此外,我在阅读关于 VBO 的维基百科条目时第一次遇到这个问题,他们的示例代码不包括对的调用,glGenVertexArrays()但他们仍然用glVertexAttribPointer(). Wiki VBO 条目—— 出于什么原因创建 VAO 的示例?

4

3 回答 3

22

性能改进。

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

一次性完成所有这些工作,并使用 VAO 可以摊销该工作。

例如,请参阅 Graham Sellers 对实际数据的分析

于 2011-05-11T20:30:45.583 回答
17

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

于 2011-05-13T05:37:16.043 回答
7

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

于 2013-08-15T05:45:31.647 回答