【问题标题】:What are the effects of unbinding OpenGL buffers?取消绑定 OpenGL 缓冲区有什么影响?
【发布时间】:2014-04-03 02:40:40
【问题描述】:

按照教程here 了解OpenGL 3.3 的介绍,我了解到顶点和索引缓冲区需要与glBindBuffer() 绑定才能向它们发出命令。有人提到可以通过将 0 的句柄传递给 glBindBuffer() 来取消绑定缓冲区,这似乎是一个好主意,可以防止在使用完缓冲区后意外使用不正确的缓冲区。在发出设置或绘制调用后,是否有任何理由不总是取消绑定顶点和索引缓冲区?

【问题讨论】:

  • 不这样做的唯一原因可能是,如果您有一个不使用/与其他框架代码集成的线性应用程序代码,并且为了优化绘图调用,您已经确保了正确的批处理和状态变化。
  • 我认为这是一个优化问题,例如:如果您有一个设置例程,其中包含一些影响缓冲区甚至可能绘制它的函数,以及一些其他例程,这些例程将始终在第一个之后调用一个,还需要对一个缓冲区执行操作,但另一个缓冲区。所以很明显,在这种情况下,使用所需的缓冲区调用glBindBuffer() 会更有效,而不是使用 0 调用它然后绑定第二个缓冲区。

标签: opengl opengl-3


【解决方案1】:

由于 OpenGL 的架构是一种状态机,因此经常会提出此类话题 - 并且没有明确的答案。缓冲区绑定确实会影响其他各种 GL 命令的操作,具体取决于绑定目标。

在某些情况下,对象 0 代表一些“无缓冲区/默认对象”的情况。例如,对于GL_PIXEL_UNPACK_BUFFER,使用 0 将允许您将像素数据直接从客户端内存传输到 GL - 因此,如果您想这样做,您绝对需要在某个时候取消绑定任何绑定的 PBO。是否尽可能早或尽可能晚地执行此操作取决于作为程序员的您,并且在很大程度上取决于您的软件架构。一般规则应该是避免不必要的状态更改,包括缓冲区(取消)绑定操作。但遵循这条路线通常会导致某些状态“泄漏”到其真正意图的范围之外 - 并且这样的东西可能会令人讨厌调试。

在其他情况下,0 不是执行任何操作的有效状态。例如,现代 GL 要求您使用 VBO。真的不需要将 0 绑定为 GL_ARRAY_BUFFER,因为唯一的用例 - 指定一些指向客户端内存的属性指针 - 已经消失了。所以取消绑定一个 VBO 总是浪费时间——下次你设置一个属性指针时,无论如何你必须绑定一些 VBO,如果你不设置一个属性指针,那个绑定目标就完全无关紧要了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多