OpenGL对自身的上下文是非常敏感的,稍有不慎可能就会导致内存泄漏,或者没有释放正确,就比如 QOpenGLVertexArrayObject::destroy() failed to restore current context 问题,由于上下文的问题没有办法正确的释放QOpenGLVertexArrayObject VAO对象。
发生的原因:我想在QOpenGLWidget的析构函数 delete 掉我的网格类对象,网格类对象内使用了VAO对象也就是QOpenGLVertexArrayObject 这个类,两个类的析构大致如下
Mesh类:
Mesh::~Mesh(){
m_VBO.destroy();
m_VAO.destroy();
}
MyOpenGLWidget类:
MyOpenGLWidget::~MyOpenGLWidget(){
delete mesh;
}
在关闭窗口后控制台面板就输出了这个问题
解决方法:
这个问题的原因就是因为在OpenGL窗口结束了之后,最后在析构的时候还有使用到OpenGL的东西,就是delete mesh对象时mesh的析构又调用了QtOpenGL相关内容导致的OpenGL上下文不正确。
所以在MyOpenGLWidget的析构函数中加入下面的函数来确保上下文正确。
MyOpenGLWidget::~MyOpenGLWidget(){
// 确保释放opengl资源时上下文正确
makeCurrent();
delete mesh;
doneCurrent();
}
这也是我现阶段所学的OpenGL知道的一个解决办法,如果还有其他办法再说吧。