【发布时间】: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