use*_*129 77 opengl opengl-3 vao
我面临一个问题,我相信是VAO依赖的,但我不确定..
我不确定VAO的正确用法,我在GL初始化期间做的事情很简单
glGenVertexArrays(1,&vao)
Run Code Online (Sandbox Code Playgroud)
接下来是
glBindVertexArray(vao)
Run Code Online (Sandbox Code Playgroud)
后来,在我的绘图管道中,我只调用glBindBuffer(),glVertexAttribPointer(),glEnableVertexAttribArray()等等,而不关心初始绑定的VAO
这是正确的做法吗?
Rob*_*ani 88
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
Run Code Online (Sandbox Code Playgroud)
这避免了绑定/解除绑定缓冲区的混乱并传递每个顶点属性的所有设置,并仅使用单个方法调用替换它,绑定VAO.
Mār*_*iko 24
不,那不是你如何使用VAO.您应该以与使用VBO或纹理或着色器相同的方式使用VAO.首先进行设置.在渲染过程中只绑定它们,而不进行修改.
所以使用VAO你会做到以下几点:
void Setup() {
glGenVertexArrays(..);
glBindVertexArray(..);
// now setup all your VertexAttribPointers that will be bound to this VAO
glBindBuffer(..);
glVertexAttribPointer(..);
glEnableVertexAttribArray(..);
}
void Render() {
glBindVertexArray(vao);
// that's it, now call one of glDraw... functions
// no need to set up vertex attrib pointers and buffers!
glDrawXYZ(..)
}
Run Code Online (Sandbox Code Playgroud)
另见这些链接:
归档时间: |
|
查看次数: |
39824 次 |
最近记录: |