我对使用以下函数生成/创建顶点数组对象(VAO)的观点感到困惑:
glGenVertexArrays(GLsizei n, GLuint *arrays);
和
glBindVertexArray(GLuint);
因为我仍然可以为顶点创建一个缓冲区对象,并使用glVertexAttribPointer
和glEnableVertexAttribArray
描述该缓冲区对象,而无需创建VAO。
我的问题是,如果您不必实际创建VAO来描述缓冲区对象中的数据,为什么OpenGL SuperBible 5ed这样的源包含在创建VBO时创建VAO的调用?它们仅用于我尚未发现的更高级的主题,我完全糊涂了吗?
此外,我首次在VBO上阅读wikipedias条目时遇到此问题,其示例代码不包含对glGenVertexArrays()
的调用,但他们仍使用glVertexAttribPointer()
描述数据。Wiki VBO entry -
Example where VAOs are created for what reason?
答案 0 :(得分:21)
性能改进。
在许多情况下,在主机上设置属性需要大量的API调用,并且在实现中需要进行大量的验证。
完成所有这些操作,并使用VAO允许该工作分摊。
例如,请参阅Graham Sellers的analysis了解实际数据。
答案 1 :(得分:15)
假设您正在构建一个需要三个VBO的对象(阴影的不同数据,可能是位置,法线和一些花式效果参数)。每次绘制此对象时,都必须绑定所有这些VBO并设置任何其他参数。如果使用VAO,则只需使用一次调用(绑定顶点数组),这将为特定对象设置整个环境。
答案 2 :(得分:6)
答案并不像你想象的那么难。把它想象成一个有趣的比喻; VertexArrayObject
是老板,它管理着几个VetexBufferObjects
的工作人员。