【发布时间】:2016-09-11 07:53:57
【问题描述】:
快速提问:我一直看到 VAO 网格以这种方式在“绘制”调用中启用它们的顶点属性数组:
void draw() {
bindVAO();
glEnableVertexAttribArray(0 ... 3);
glDrawElements(...);
glDisableVertexAttribArray(0 ... 3);
unbindVAO();
}
我还注意到,我可以直接从 Draw Elements 调用中直接省略后半部分:
void draw() {
bindVAO();
glEnableVertexAttribArray(0 ... 3);
glDrawElements(...);
}
同样,我将 glEnableVertexAttribArray() 调用移至网格生成/加载函数,一切似乎都运行良好。
我想知道所有这些是否合法,以及是否有原因为什么许多示例代码(或其他类似性质的东西)在绘图调用旁边启用和禁用属性数组(肯定是每次都这样做)帧/绘制周期是浪费时间)。
【问题讨论】:
-
之所以看到这个,是因为网上有很多不好的例子。然后人们开始复制它们,并创造更多。不必在每次绘制调用之前调用这些函数是首先使用 VAO 的主要目的。
-
@Reto Koradi 是的,这就是我想的 XD,无论如何我更愿意问。
-
VAO 存储此状态,因此您可以使用带有所有状态设置的 VAO。或者您可以绑定 VAO,然后在每次绘制时不断更改状态,两者都是正确的,但 VAO 会记住您所做的任何更改(您可能不会)。
标签: opengl graphics mesh opengl-3 opengl-4