我面临一个问题,我认为该问题与 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/