OpenGL:VBO删除的奇怪巴哈维

OpenGL: Strange bahaviour of VBO deletion?

本文关键字:哈维 VBO 删除 OpenGL      更新时间:2023-10-16

我在顶点缓冲区对象(VBO)中遇到了一个奇怪的问题。我创建了一个包含 VBO 创建和删除的类。我删除了类析构函数中的所有 VBO(使用 glDeleteBuffers())。

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

我的问题是为什么会发生这种情况?我知道OpenGL是一个状态机,但我们不能创建一个完整的新独立类对象吗?

我注意到 (glDeleteTextures()) 同样的效果,如果我不使用析构函数删除纹理,则不会发生任何奇怪的事情,但是如果我删除一个 Glwindows 纹理,它会对渲染的第二个 Glwindow 产生影响并且纹理消失。

这是已知问题还是仅发生在我身上?

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

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

超越共享上下文的对象包括

  • 帧缓冲对象
  • 顶点数组对象