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