【问题标题】:where is the correct place to glEnableVertexAttribArrayglEnableVertexAttribArray 的正确位置在哪里
【发布时间】: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


【解决方案1】:

如果您在单个 VAO 中使用 VAO并且不要更改缓冲区绑定,那么将 glEnableVertexAttribArray 绑定到 VAO 创建和更新是非常好的,并且推荐。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多