代码之家  ›  专栏  ›  技术社区  ›  masrtis

解除绑定OpenGL缓冲区的影响是什么?

  •  4
  • masrtis  · 技术社区  · 11 年前

    跟随教程 here 为了介绍OpenGL3.3,我了解顶点和索引缓冲区需要与glBindBuffer()绑定,以便向它们发出命令。有人提到,可以通过向glBindBuffer()传递一个0的句柄来解除缓冲区的绑定,这似乎是一个好主意,可以防止在使用完不正确的缓冲区时意外使用它。在发出setup或draw调用后,是否有理由不总是解除顶点和索引缓冲区的绑?

    1 回复  |  直到 11 年前
        1
  •  8
  •   derhass    11 年前

    由于OpenGL作为一种状态机的体系结构,这类主题经常被提出,而且没有明确的答案。缓冲区绑定确实会影响其他各种GL命令的操作,具体取决于绑定目标。

    在某些情况下,对象0表示某些“无缓冲区/默认对象”情况。例如,使用 GL_PIXEL_UNPACK_BUFFER ,使用0将允许您将像素数据直接从客户端内存传输到GL-因此,如果您想这样做,您绝对需要在某一点解除绑定任何绑定的PBO。作为程序员,你是否尽早或尽早完成这项工作取决于你,这在很大程度上取决于你的软件架构。一般规则应该是避免不必要的状态更改,这包括缓冲区(取消)绑定操作。但是,遵循这条路线通常会导致某些状态“泄漏”超出其真正的范围,而这种情况可能会让调试人员感到厌烦。

    在其它情况下, 0 不是执行任何操作的有效状态。例如,现代GL要求您使用VBO。实际上不需要将0绑定为 GL_ARRAY_BUFFER ,因为唯一的用例-指定一些指向客户端内存的attrib指针-已经不存在了。因此,解除绑定VBO总是在浪费时间——下次设置attrib指针时,无论如何都必须绑定一些VBO,如果不设置attrib指标,那么绑定目标就完全不相关了。