QOpenGLWidget在Qt中设置OpenGL

Setting Up OpenGL in Qt for QOpenGLWidget

本文关键字:设置 OpenGL Qt QOpenGLWidget      更新时间:2023-10-16

我用GLEW创建了一些旧的OpenGL代码。我正试图将此代码移植到Qt 5.4中,旧代码包含Mesh, ShaderTexture类。

我在Qt到目前为止,是默认的主窗口和Visualizer类,从QOpenGLWidgetQOpenGLFunctions继承。通过将MainWindow设置为Visualizer的父元素,我可以将小部件显示为黑盒。

为了编译使用glGenVertexArrays();等函数的旧OpenGL代码,我从QOpenGLFunctions_3_3_Core继承了类。我还在必要的地方调用initializeOpenGLFunctions(),例如在Visualizer类的initializeGL()内部以及Mesh, ShaderTexture的构造函数中。

都编译得很好。但是当我运行程序时,当试图创建Mesh对象时调用glGenVertexArrays();函数时,它崩溃了。

我猜有某种类型的内存侵犯。我是否必须手动在Qt中为QOpenGLWidget设置OpenGL上下文?

如何使用Qt正确设置OpenGL 3.3,以便我可以使用QOpenGLWidget来渲染OpenGL内容并使用所有这些OpenGL功能,如glGenVertexArrays() ?

我想到了一个有趣的解决方案。也许这是显而易见的,但我一开始并没有看到。我基本上在一个虚拟类GL中创建了一个QOpenGLFunctions_3_3_Core类型的静态变量,并在需要OpenGL函数时在整个代码中使用它。

例如

class GL{
  public:
    static QOpenGLFunctions_3_3_Core funcs;
}
...
class Visualizer : public QOpenGLWidget{
   ...
   void initializeGL(){
      GL::funcs.initializeOpenGLFunctions();
   }
   ...
}
...
// Example usage
GL::funcs.glGenVertexArrays(1, &id);
GL::funcs.glClearColor(1.f, 1.f, 1.f, 1.f);