我有一些我用GLEW创建的旧OpenGL代码。我正在尝试将此代码移植到Qt 5.4中,旧代码包含Mesh
,Shader
和Texture
类。
到目前为止,我在Qt中所拥有的是默认主窗口和Visualizer
类,它继承自QOpenGLWidget
和QOpenGLFunctions
。通过将MainWindow
设置为Visualizer
的父级,我可以将小部件显示为黑框。
为了编译使用glGenVertexArrays();
等函数的旧OpenGL代码,我使这些类继承自QOpenGLFunctions_3_3_Core
。我还会在必要时拨打initializeOpenGLFunctions()
,例如initializeGL()
类的Visualizer
内部以及Mesh
,Shader
和Texture
的构造函数。
这一切都很好。但是当我运行程序时,在尝试创建glGenVertexArrays();
对象时调用函数Mesh
时会崩溃。
我猜是某种内存违规。我是否必须在Qt中为QOpenGLWidget
?
如何使用Qt正确设置OpenGL 3.3,以便我可以使用QOpenGLWidget
呈现OpenGL内容并使用所有这些OpenGL函数,例如glGenVertexArrays()
?
答案 0 :(得分:0)
我提出了一个有趣的解决方案。也许这很明显,但我一开始并没有看到它。我基本上在一个虚拟类QOpenGLFunctions_3_3_Core
中创建了一个类型为GL
的静态变量,并在需要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);