OpenGL VAO 最佳实践

标签 opengl opengl-3 vao

我面临一个问题,我认为该问题与 VAO 相关,但我不确定..

我不确定 VAO 的正确用法,我在 GL 初始化期间所做的很简单

glGenVertexArrays(1,&vao)

后跟

glBindVertexArray(vao)

后来,在我的绘图管道中,我只是调用了glBindBuffer()、glVertexAttribPointer()、glEnableVertexAttribArray()等等......而不关心初始绑定(bind)的VAO

这是正确的做法吗?

最佳答案

就绑定(bind)方式而言,VAO 的作用与 VBO 和纹理类似。在程序的整个长度上使用单个 VAO 不会产生任何性能优势,因为您可能根本就没有 VAO 进行渲染。事实上,它可能会更慢,具体取决于实现在绘制顶点属性设置时如何拦截它们。

VAO 的要点是在初始化期间运行一次绘制对象所需的所有方法,并在主循环期间消除所有额外的方法调用开销。重点是拥有多个 VAO 并在绘图时在它们之间切换。

就最佳实践而言,您应该如何组织代码:

initialization:
    for each batch
        generate, store, and bind a VAO
        bind all the buffers needed for a draw call
        unbind the VAO

main loop/whenever you render:
    for each batch
        bind VAO
        glDrawArrays(...); or glDrawElements(...); etc.
    unbind VAO

这避免了绑定(bind)/取消绑定(bind)缓冲区和传递每个顶点属性的所有设置的困惑,并用绑定(bind) VAO 的单个方法调用替换它。

关于OpenGL VAO 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8923174/

相关文章:

objective-c - 不使用 Interface Builder 创建 OpenGL View

c++ - 如何正确添加状态栏?

c - 在 C 中绘制过剩对象之间的交集

opengl - 通过OpenGL编程访问整个显存

c++ - OpenGL 顶点从侧面被剪切

opengl - 读取 unsigned int 时 glReadPixels 的精度

c++ - 为什么我的 OpenGL 3.3 应用程序不绘制任何东西?

javascript - WebGL 2.0 : Draw call succeeds even VBO is deleted

java - 使用 VAO 和 VBO 在 LWJGL 3 中渲染四边形时出现问题

c++ - 使用 IBO/EBO 时,程序仅在创建 VAO 后调用 glBindBuffer 绑定(bind) IBO/EBO 时才有效