OpenGL:VBO删除的奇怪行为?

OpenGL: Strange bahaviour of VBO deletion?

我在顶点缓冲区对象 (VBO) 中遇到了一个奇怪的问题。我创建了一个包含 VBO 创建和删除的 class。我删除了 class.

的析构函数中的所有 VBO(使用 glDeleteBuffers())

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

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

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

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

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

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

超越共享上下文的对象中

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