快速问题:我总是看到VAO网格在'draw'调用中以这样的方式启用它们的顶点属性数组:
void draw() {
bindVAO();
glEnableVertexAttribArray(0 ... 3);
glDrawElements(...);
glDisableVertexAttribArray(0 ... 3);
unbindVAO();
}
我还注意到我可以直接省略Draw Elements调用的后半部分,如下所示:
void draw() {
bindVAO();
glEnableVertexAttribArray(0 ... 3);
glDrawElements(...);
}
同样,我将glEnableVertexAttribArray()
调用移动到网格生成/加载函数,一切似乎都运行良好。
我想知道如果这一切都是合法的,如果有一个原因,为什么许多样例代码(或其他类似性质的东西)有属性数组启用和禁用旁边的绘制调用(当然做每一帧/绘制周期是浪费时间)。
如果您在单个VAO中使用VAOs 和而不更改缓冲区绑定,那么将glEnableVertexAttribArray
绑定到VAO创建和更新中是完全可以的,并且推荐使用。
但是,如果没有使用VAO或VAO内的绑定是动态更改的,那么将glEnableVertexAttribArray
放置在绑定代码附近(这通常发生在绘图中,然后)是更好的选择。