我用GLEW创建了一些旧的OpenGL代码。我正试图将此代码移植到Qt 5.4中,旧代码包含Mesh
, Shader
和Texture
类。
我在Qt到目前为止,是默认的主窗口和Visualizer
类,从QOpenGLWidget
和QOpenGLFunctions
继承。通过将MainWindow
设置为Visualizer
的父元素,我可以将小部件显示为黑盒。
为了编译使用glGenVertexArrays();
等函数的旧OpenGL代码,我从QOpenGLFunctions_3_3_Core
继承了类。我还在必要的地方调用initializeOpenGLFunctions()
,例如在Visualizer
类的initializeGL()
内部以及Mesh
, Shader
和Texture
的构造函数中。
都编译得很好。但是当我运行程序时,当试图创建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);