【问题标题】:OpenGL: Strange bahaviour of VBO deletion?OpenGL:VBO删除的奇怪行为?
【发布时间】:2015-06-19 22:30:24
【问题描述】:

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

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

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

我注意到 (glDeleteTextures()) 的效果相同p>

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

【问题讨论】:

  • @genpfault 怎么了?这不是一个正确的问题吗?奇怪...
  • 您可能因为没有发布代码而获得了接近投票。人们在用 C++ 包装 OpenGL 对象时经常会遇到一些神秘的问题。原因几乎总是对象由于某种原因被复制/分配,但没有正确的复制语义。有关一些示例和背景,请参见我的答案:stackoverflow.com/questions/28929452/…
  • 非常感谢 Koradi.. 你的回答是我所需要的。非常感谢..
  • 嗨 Koradi,我发现了问题,问题出在 QGLWidget 的多个上下文中。我正在使用 VBO 渲染创建多个 GLwindows。当一个窗口被激活/聚焦/选择/使用makecurrent调用鼠标移动事件时,vbo工作正常,但是当其他窗口停用/取消聚焦/取消选择时,它不会从它自己的VBO对象生效,但它需要最后一个选定窗口的 VBO。
  • 例如,如果我想翻译对象,我去Qtreewidget并右键单击它,然后按翻译,单击QtreeWidget激活QGLwidget并更新VBO。现在我翻译第二个窗口的 VBO 对象,它不起作用。它仅在我在两个窗口的渲染器上移动鼠标时才有效,因为它通过 makecurrent() 调用调用鼠标移动事件。所以,我尝试了每一个技巧,但没有任何效果,我不知道为什么在 MDI 窗口未激活时 VBO 不起作用。

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


【解决方案1】:

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

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

在对象中超越共享上下文是

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

【讨论】:

  • 感谢 datenwolf,您能否查看我对 Koradi 的最新回复?我不知道我该如何解决这个问题?我只是放弃了它。我现在应该使用 VAO 吗?
  • @furqan:没有看到任何实际代码,很难给出任何有用的建议。 10 行代码往往值一万字。
猜你喜欢
  • 2016-07-15
  • 1970-01-01
  • 2015-01-03
  • 2011-04-14
  • 2017-11-20
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多