快速问题:我一直看到VAO网格在“绘制”内部启用了顶点属性数组。以这种方式打电话:
void draw() {
bindVAO();
glEnableVertexAttribArray(0 ... 3);
glDrawElements(...);
glDisableVertexAttribArray(0 ... 3);
unbindVAO();
}
我还注意到我可以直接从Draw Elements调用中省略下半部分:
void draw() {
bindVAO();
glEnableVertexAttribArray(0 ... 3);
glDrawElements(...);
}
类似地,我将glEnableVertexAttribArray()
调用移动到网格生成/加载函数,一切似乎运行正常。
我想知道所有这些是否合法,并且是否有理由为什么许多示例代码(或其他具有此类性质的东西)在绘制调用旁边启用并禁用了属性数组(当然这样做框架/绘制周期是浪费时间)。
答案 0 :(得分:2)
如果您在单个VAO中使用VAO 和,请不要更改缓冲区绑定,然后将glEnableVertexAttribArray
绑定到VAO创建和更新是完全正常的,建议使用。
但是,如果没有使用VAO或VAO中的绑定动态更改,那么将glEnableVertexAttribArray
放在绑定代码附近(通常在绘图中发生,那么)更合适。