Qt5和GLEW MX => glewInit失败了

时间:2015-01-23 23:54:41

标签: multithreading opengl qt5 openglcontext

我们正在将项目从Qt 4.8迁移到5.4。我们在多线程中使用多个上下文。我们为此目的使用GLEW MX(我们创建当前需要的上下文然后在GLEWContextStruct的本地实例上调用glewInit())。

我试图将QGLWidget和QGLContext更改为QOpenGLWidget和QOpenGLContext但我最终无法初始化glew。 GLEW不会返回错误但glGetError()会返回错误。

我确实使用OpenGL版本安装了Qt 5.4 64.

以下代码减少到最低限度:

#include <QtWidgets/QApplication>

#define GLEW_MX
#define GLEW_STATIC
#include <GL/glew.h>

#include <qopenglcontext.h>
#include <qwindow.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    bool errQt;
    int errGlew;
    GLenum errorGL;

    QSurfaceFormat requestedFormat;
    requestedFormat.setVersion(3, 3);
    requestedFormat.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile);

    //Creates the QGLWidget using the current context:
    QWindow window;
    window.setSurfaceType(QSurface::OpenGLSurface);
    window.setFormat(requestedFormat);
    window.create();

    //Create context
    QOpenGLContext context;
    context.setFormat(requestedFormat);
    errQt = context.create(); //true

    //Bind context
    context.makeCurrent(&window);

    //Glew context creation
    GLEWContext* pCtx = new GLEWContext; //All forwards undefined

    //Release context
    context.doneCurrent();

    return 1;
}

有什么建议吗? Qt5.4的GLEW是否正常?

编辑1:

看来问题与Qt无关。创建的GLEWContext没有定义任何函数(所有函数指针都是未定义的)。该代码已更新,以帮助审稿人不会失去焦点。

2 个答案:

答案 0 :(得分:0)

我在我的项目中使用了Qt 5.4的glewInit(),但是我使用QWindow作为我的基类,而不是QOpenGLWidget。

在我的照片中,我这样做:

QRiftWindow::QRiftWindow() {
 setSurfaceType(QSurface::OpenGLSurface);
 QSurfaceFormat format;
 format.setDepthBufferSize(16);
 format.setStencilBufferSize(8);
 format.setVersion(4, 3);
 format.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile);
 setFormat(format);

 m_context = new QOpenGLContext;
 m_context->setFormat(format);
 m_context->create();
 ...

我在一个单独的线程上执行我的OpenGL工作。一旦线程启动,我就在我的课程上调用一个设置方法

m_context->makeCurrent(this);
glewExperimental = true;
glewInit();
glGetError();

我之前使用OpenGL 3.3进行了完全相同的设置并且没有任何问题。

答案 1 :(得分:0)

你实际上应该收到警告:

#warning qopenglfunctions.h与GLEW不兼容,GLEW定义将是未定义的

#warning要在Qt中使用GLEW,请不要包含或在glew.h之后

你的&#34; qopenglcontext.h&#34;包括。要回答你的问题,你可以使用Qt + GLEW,但你不能轻易地将Qt-opengl与GLEW混淆。