【问题标题】:Setting Up OpenGL in Qt for QOpenGLWidget在 Qt 中为 QOpenGLWidget 设置 OpenGL
【发布时间】:2015-06-01 00:36:31
【问题描述】:

我有一些用 GLEW 创建的旧 OpenGL 代码。我正在尝试将此代码移植到 Qt 5.4 中,旧代码包含 MeshShaderTexture 类。

到目前为止,我在 Qt 中拥有的是默认主窗口和一个从 QOpenGLWidgetQOpenGLFunctions 继承的 Visualizer 类。通过将MainWindow 设置为Visualizer 的父级,我可以将小部件显示为黑框。

为了编译使用 glGenVertexArrays(); 之类的函数的旧 OpenGL 代码,我让这些类继承自 QOpenGLFunctions_3_3_Core。我还会在必要时调用initializeOpenGLFunctions(),例如在Visualizer 类的initializeGL() 内部以及MeshShaderTexture 的构造函数中。

这一切都编译得很好。但是,当我运行该程序时,它会在尝试创建 Mesh 对象时调用函数 glGenVertexArrays(); 时崩溃。

我猜有某种形式的内存违规。我是否必须在 Qt 中为 QOpenGLWidget 手动设置 OpenGL 上下文?

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

【问题讨论】:

    标签: c++ qt opengl qt5


    【解决方案1】:

    我想出了一个有趣的解决方案。也许这很明显,但我一开始并没有看到。我基本上在一个虚拟类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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多