正如 Qt 用户所知,使用任何 OpenGL 扩展都可能非常麻烦。我让它工作的方法是扩展 QGLFunctions 类,如下所示:
class Object3D : protected QGLFunctions{
...
}
为了使 Object3D 能够正确运行,以便它可以调用 glGenBuffer() 等函数,需要调用
initializeGLFunctions(glWidget->context());
创建 QGLWidget 后,否则当应用程序使用任何扩展函数时,它只会使应用程序崩溃。虽然我最终可以在 Object3D 存在期间调用“glGenBuffer()”和其他函数,但它似乎在包含“glDeleteBuffer()”调用的 ~Object3D() 调用时崩溃。我确信正是该调用导致应用程序崩溃。
有人知道如何解决这个问题吗?我怀疑这是因为 QGLWidget 在 Object3D 之前先被删除,所以 QGLWidget 的上下文消失了。如果是这种情况,我怎样才能确保 QGLWidget 最后被删除,因为 QGLWidget 被添加到 QMainWindow 中,而 QMainWindow 只是按照添加顺序删除其子级?
一般规则是,如果你不能保证当上下文仍然存在时,OpenGL RAII 对象将被销毁,那么不要将 OpenGL 对象包装在 RAII C++ 类中。通过其他方式管理 OpenGL 对象的生命周期。
这是您的代码(您忘记向我们展示);只有您可以决定在何处或如何管理类的销毁。您需要一些系统来管理您的对象,以确保事物按正确的顺序销毁(和创建)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)