OpenGL:VBO删除的奇怪行为?

时间:2015-06-19 22:30:25

标签: c++ opengl vbo opengl-3 vao

我在Vertex Buffer Object(VBO)中遇到了一个奇怪的问题。我创建了一个包含VBO创建和删除的类。我删除了类的析构函数中的所有VBO(使用glDeleteBuffers())。

现在我创建了2个OpenGL上下文窗口,每个窗口都运行VBO类。现在,当我关闭一个GLwindow时,它的析构函数调用并且VBO也被删除,但奇怪的是第二个窗口上的析构函数效果,第二个窗口上运行的对象消失了。当我使用弃用的glVertex3fv进行渲染时,我可以看到对象但不能看到VBO。 如果我不使用GLwindow类的析构函数删除VBO,一切正常。我不应该删除每个上下文删除VBO吗?

我的问题是为什么会这样?我知道OpenGL是一个状态机,但是我们不能创建一个全新的独立类对象吗?

我注意到与(glDeleteTextures())相同的效果如果我不使用析构函数删除纹理,没有什么奇怪的事情发生但是如果我删除一个Glwindows纹理,它会影响渲染的第二个Glwindow,纹理会消失。

它是否已知问题或仅发生在我身上?

1 个答案:

答案 0 :(得分:0)

Reto Koradi已经提到了复制语义。要记住的另一件事是OpenGL允许上下文共享,即一些对象在OpenGL上下文之间共享,并且在一个上下文中删除将其从所有上下文中删除。超越共享上下文的对象是

  • 纹理
  • 使用glBindBuffer
  • 绑定的缓冲区对象
  • 渲染缓冲区

中超出共享上下文的对象

  • framebuffer objects
  • 顶点数组对象