c++ - 在 Qt 中为 QOpenGLWidget 设置 OpenGL

标签 c++ qt opengl qt5

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

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

为了编译使用像 glGenVertexArrays(); 这样的函数的旧 OpenGL 代码,我让这些类继承自 QOpenGLFunctions_3_3_Core。我还在必要时调用 initializeOpenGLFunctions(),例如在 Visualizer 类的 initializeGL() 内部和 Mesh 的构造函数中code>、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);

关于c++ - 在 Qt 中为 QOpenGLWidget 设置 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30564190/

相关文章:

java - 谷歌 Protocol Buffer - 用 C++ 编码,用 Java 解码 - InvalidProtocolBufferException

c++ - QProcess 已失效且无法重新启动

opengl - 使用 OpenGL 有效地绘制大量多边形?

java - 片段着色器无法编译

交换每个水平对绘制的 OpenGL 像素

c++ - 着色和调色板最佳拟合算法

c++ - 对 vector 使用[] []运算符?

c++ - 将 C 数组分配给 C+ +'s std::array? (std::array<T,U> = T[U]) - no suitable constructor exists from "T [U ]"to "std::array<T,U>"

qt - 如何在 64 位 Ubuntu 上构建 32 位 Qt5 应用程序

c++ - QML 应用程序 block