我面临着一个我认为依赖于 VAO 的问题,但我不确定..
我不确定 VAO 的正确用法,我在 GL 初始化期间所做的只是一个简单的
glGenVertexArrays(1,&vao)
随后是一个
glBindVertexArray(vao)
后来,在我的绘图管道中,我只是调用glBindBuffer()、glVertexAttribPointer()、glEnableVertexAttribArray()等等..而不关心最初绑定的VAO
这是正确的做法吗?
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
这避免了绑定/取消绑定缓冲区和传递每个顶点属性的所有设置的混乱,并用绑定 VAO 的单个方法调用替换它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)