在 Qt 中为 QOpenGLWidget 设置 OpenGL
Setting Up OpenGL in Qt for QOpenGLWidget
我有一些用 GLEW 创建的旧 OpenGL 代码。我正在尝试将此代码移植到 Qt 5.4 中,旧代码包含 Mesh
、Shader
和 Texture
classes.
到目前为止,我在 Qt 中拥有的是默认的 main window 和继承自 QOpenGLWidget
和 QOpenGLFunctions
的 Visualizer
class。通过将 MainWindow
设置为 Visualizer
.
的父级,我可以将小部件显示为黑框
为了编译使用 glGenVertexArrays();
等函数的旧 OpenGL 代码,我使 classes 继承自 QOpenGLFunctions_3_3_Core
。我还在必要时调用 initializeOpenGLFunctions()
,例如 Visualizer
class 的 initializeGL()
内部以及 Mesh
、Shader
和 [= 的构造函数中12=].
编译都很好。但是,当我 运行 程序在尝试创建 Mesh
对象时调用函数 glGenVertexArrays();
时它崩溃了。
我猜测存在某种内存冲突。我是否必须在 Qt 中为 QOpenGLWidget
手动设置 OpenGL 上下文?
如何使用 Qt 正确设置 OpenGL 3.3,以便我可以使用 QOpenGLWidget
渲染 OpenGL 内容并使用所有这些 OpenGL 函数,例如 glGenVertexArrays()
?
我想到了一个有趣的解决方案。也许这很明显,但我一开始没有看到。我基本上在虚拟 class、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);
我有一些用 GLEW 创建的旧 OpenGL 代码。我正在尝试将此代码移植到 Qt 5.4 中,旧代码包含 Mesh
、Shader
和 Texture
classes.
到目前为止,我在 Qt 中拥有的是默认的 main window 和继承自 QOpenGLWidget
和 QOpenGLFunctions
的 Visualizer
class。通过将 MainWindow
设置为 Visualizer
.
为了编译使用 glGenVertexArrays();
等函数的旧 OpenGL 代码,我使 classes 继承自 QOpenGLFunctions_3_3_Core
。我还在必要时调用 initializeOpenGLFunctions()
,例如 Visualizer
class 的 initializeGL()
内部以及 Mesh
、Shader
和 [= 的构造函数中12=].
编译都很好。但是,当我 运行 程序在尝试创建 Mesh
对象时调用函数 glGenVertexArrays();
时它崩溃了。
我猜测存在某种内存冲突。我是否必须在 Qt 中为 QOpenGLWidget
手动设置 OpenGL 上下文?
如何使用 Qt 正确设置 OpenGL 3.3,以便我可以使用 QOpenGLWidget
渲染 OpenGL 内容并使用所有这些 OpenGL 函数,例如 glGenVertexArrays()
?
我想到了一个有趣的解决方案。也许这很明显,但我一开始没有看到。我基本上在虚拟 class、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);