glEnableVertexAttribArray 的正确位置在哪里

where is the correct place to glEnableVertexAttribArray

快速提问:我一直看到 VAO 网格以这种方式在 'draw' 调用中启用它们的顶点属性数组:

void draw() {
    bindVAO();
    glEnableVertexAttribArray(0 ... 3);
    glDrawElements(...);
    glDisableVertexAttribArray(0 ... 3);
    unbindVAO();
}

我还注意到我可以完全省略 Draw Elements 调用的后半部分:

void draw() {
    bindVAO();
    glEnableVertexAttribArray(0 ... 3);
    glDrawElements(...);
}

同样,我将 glEnableVertexAttribArray() 调用移至网格 generation/loading 函数,一切似乎都 运行 正常。

我想知道所有这一切是否合法,以及是否有许多示例代码(或其他类似性质的东西)在绘制调用旁边启用和禁用属性数组的原因(肯定是这样做的)每 frame/draw 个周期都是浪费时间。

如果您在单个 VAO 中使用 VAO ,请不要更改缓冲区绑定,然后将 glEnableVertexAttribArray 绑定到 VAO 创建和更新就完全没问题了,并且推荐。

但是,如果不使用 VAO 或动态更改 VAO 中的绑定,则将 glEnableVertexAttribArray 放置在绑定代码附近(这通常发生在绘图中)更合适。