了解顶点数组对象(glGenVertexArrays)

Understanding Vertex Array Objects (glGenVertexArrays )

本文关键字:glGenVertexArrays 对象 顶点 数组 了解      更新时间:2023-10-16

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

glGenVertexArrays(GLsizei n, GLuint *arrays);

glBindVertexArray(GLuint);

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

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

此外,我在阅读 VBO 上的维基百科条目时第一次遇到这个问题,它们的示例代码不包含对glGenVertexArrays()的调用,但它们仍然用 glVertexAttribPointer() 描述数据。维基VBO词条 --出于什么原因创建 VAO 的示例?

性能改进。

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

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

例如,参见格雷厄姆·塞勒斯(Graham Sellers)对实际数据的分析。

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

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

相关文章:
  • 没有找到相关文章