随着下面的教程在这里得到一个介绍的OpenGL 3.3,我明白,顶点和索引缓冲区必须以发出指令,他们glBindBuffer()的约束.提到可以通过将一个0的句柄传递给glBindBuffer()来取消绑定缓冲区,这在使用它时防止意外使用不正确的缓冲区似乎是一个好主意.在发出设置或绘制调用后,有没有理由不总是取消绑定顶点和索引缓冲区?
由于OpenGL作为状态机的架构,这些主题经常被提出 - 并且没有明确的答案.缓冲区绑定确实会影响各种其他GL命令的操作,具体取决于绑定目标.
在某些情况下,对象0表示某些"无缓冲区/默认对象"的情况.例如,GL_PIXEL_UNPACK_BUFFER
使用0将允许您将像素数据直接从客户端内存传输到GL - 因此,如果您想这样做,您绝对需要在某个时刻取消绑定任何绑定的PBO.如果您尽早或尽可能早地完成这项工作取决于您作为程序员,并且在很大程度上取决于您的软件架构.一般规则应该是避免不必要的状态更改,并且包括缓冲(un)绑定操作.但是遵循这条路线经常会导致一些状态"泄漏"超出其真正意图的范围 - 这样的东西可能会令调试烦人.
在其他情况下,0
做任何事情都不是一个有效的状态.例如,现代GL要求您使用VBO.实际上并没有必要将0绑定为GL_ARRAY_BUFFER
,因为唯一的用例 - 指定一些指向客户端内存的attrib指针 - 已经消失.所以取消绑定VBO总是浪费时间 - 下次设置attrib指针时,你必须绑定一些VBO,如果你没有设置attrib指针,那么绑定目标就完全无关紧要了.