了解顶点数组对象(glGenVertexArrays)

blu*_*uth 32 c c++ opengl opengl-3

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

glGenVertexArrays(GLsizei n, GLuint *arrays);
Run Code Online (Sandbox Code Playgroud)

glBindVertexArray(GLuint);
Run Code Online (Sandbox Code Playgroud)

因为我仍然可以创建一个缓冲区对象,说了顶点,并描述了该缓冲区对象glVertexAttribPointer,并glEnableVertexAttribArray没有创造过一个VAO.

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

此外,我在VBO上阅读wikipedias条目时首次遇到这个问题,他们的示例代码不包含任何调用,glGenVertexArrays()但他们仍然用数据描述数据glVertexAttribPointer().Wiki VBO条目 - 出于什么原因创建VAO的示例?

Bah*_*bar 21

性能改进.

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

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

例如,参见Graham Sellers 对实际数据的分析.

  • @bluth"好吧,名称0的默认VAO仍然可以在不生成VAO的情况下使用":不,它不能.不符合核心OpenGL 3.1及以上版本.如果您处于兼容模式,那么您可以这样做.但不是核心OpenGL.请注意,NVIDIA没有正确实现规范的这一部分,并允许0作为VAO.但AMD确实遵循了规范,因此如果您要求在其硬件上使用核心OpenGL上下文,则必须在程序中的某个位置创建并绑定VAO. (3认同)
  • 我认为,GL4中不使用VAO也不赞成使用.除了他们的优势之外,如果你想要向前兼容,你也必须使用它们. (2认同)

Ork*_*rka 16

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


小智 6

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