1

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

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

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

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

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

4

1 回答 1

0

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

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

超越共享上下文的对象中

  • 帧缓冲对象
  • 顶点数组对象
于 2015-06-20T10:02:27.677 回答