【问题标题】:OpenGL glBindBuffer(0) outside vao?vao之外的OpenGL glBindBuffer(0)?
【发布时间】:2014-08-20 19:18:31
【问题描述】:

我目前这样做是为了设置我的 vao:

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

...

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBindVertexArray(0);

我的问题是:我是否需要绑定空缓冲区以防止我的 vbo 和 ibo 在我完成 vao 后发生变化,或者当绑定空 vao 时它也会取消绑定当前缓冲区?例如,我会执行以下操作:

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

【问题讨论】:

    标签: opengl vao


    【解决方案1】:

    通常,您永远不会显式地取消绑定缓冲区。束缚他们不应该有任何害处。他们不会只是自发地改变。如果其他代码也使用缓冲区,则无论如何都需要绑定自己的缓冲区,然后再对它们进行操作。

    如果您使用现代 OpenGL(核心配置文件),取消绑定 VAO 绝对是一种浪费。无论如何,每个顶点设置和绘制操作都必须绑定一个 VAO,因此无需取消绑定之前的 VAO,然后再绑定一个不同的 VAO。

    但让我们暂时假设您仍想解除缓冲区绑定,以便更强大地抵御应用中可能出现的行为不端的代码,并且您愿意支付性能损失。

    GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER 的答案不同。 GL_ELEMENT_ARRAY_BUFFER 绑定是 VAO 状态的一部分。因此,如果您取消绑定 VAO,该缓冲区也将自动取消绑定。

    GL_ARRAY_BUFFER 绑定不是 VAO 的一部分。在这种情况下,您必须显式取消绑定缓冲区。

    【讨论】:

    • 很好的答案,谢谢!您不会碰巧拥有此信息的参考资料吧?
    • @NickMiller 具体是哪一部分?我在这个答案中没有看到任何看起来如此可疑以至于需要具体参考的内容。基本行为在规范文档中。例如,可以在规范的状态表中找到哪些绑定是和不是 VAO 状态的一部分。
    • 没有意识到它在规范中,至少我无论如何都找不到它。我很担心,因为 glBindVertexArray 的函数描述没有提到在绑定到零值时解除绑定 GL_ELEMENT_ARRAY_BUFFER
    • 来自 OpenGL 4.5 规范:“当没有绑定顶点数组时,任何修改、绘制或查询顶点数组状态的命令都会生成 INVALID_OPERATION 错误。这发生在初始 GL 状态[即绑定到保留值 0 时],并且可能由于BindVertexArrayDeleteVertexArrays 的副作用而发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多