在调用glDeleteBuffers之前,VBO应该被解除绑定吗?

Sri*_*ati 5 opengl buffer-objects

是否需要在删除之前取消绑定缓冲区对象?如果我将它绑定在VAO中并将其删除而不解除绑定(绑定到0),会发生什么?参考文献是否仍然存在?

public void dispose()
{
    glBindVertexArray(0);
    glDeleteVertexArrays(vaoID);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDeleteBuffers(vboVertID);
    glDeleteBuffers(vboColID);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glDeleteBuffers(eboID);
}
Run Code Online (Sandbox Code Playgroud)

删除前取消绑定是好的还是坏的做法?

And*_*man 5

有必要吗?

  没有.

这是个好主意吗?

  可能,但不是你当前的伪代码.


在删除之前,您唯一想要在GL中手动取消绑定资源的时间是在单独的上下文中绑定它.这是因为实际释放与GL资源相关联的存储器的标准之一是其引用计数为0.glDelete* (...)只有在将对象放入要释放的对象队列之前,才从当前上下文中取消绑定对象.

如果在当前未绑定的VAO 保存指向此缓冲区的指针时删除它,或者如果它绑定在与您调用的OpenGL上下文完全不同的OpenGL上下文glDelete* (...)中,则引用计数在完成之前不会达到0glDelete* (...).因此,在您实际取消绑定或销毁所有保留引用的VAO /渲染上下文之前,不会释放内存.您将有效地泄漏内存,直到您处理所有悬空引用.

简而言之,glDelete* (...)将始终从当前上下文中取消绑定资源并回收任何名称以立即重用,但是如果在解除绑定之后它将仅释放相关内存,引用计数为0.


在这种情况下,取消绑定是完全没必要的,因为您在调用的相同上下文中这样做glDeleteBuffers (...).此调用隐式取消绑定您要删除的对象,因此您正在做一些多余的事情.更重要的是,你已经在调用之前删除了你的VAO-- glDeleteBuffers (...)当删除了VAO时,它放弃了所有的指针,从而将引用计数减少到你的缓冲区.