Qt5 и GLEW MX => ошибка glewInit

Мы переносим наш проект с Qt 4.8 на 5.4. Мы используем несколько контекстов в нескольких потоках. Для этой цели мы используем GLEW MX (мы делаем нужный контекст текущим, а затем вызываем glewInit() для локального экземпляра GLEWContextStruct).

Я пытаюсь изменить QGLWidget и QGLContext на QOpenGLWidget и QOpenGLContext, но в итоге больше не могу инициализировать glew. GLEW не возвращает ошибку, но возвращает glGetError().

Я установил Qt 5.4 64 с версией OpenGL.

Вот код, сокращенный до минимума:

#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;
}

Любое предложение ? Подходит ли GLEW для Qt5.4?

РЕДАКТИРОВАТЬ 1:

Похоже, проблема не связана с Qt. Созданный GLEWContext не имеет функции, определенной вперед (все указатели функций не определены). Код был обновлен, чтобы помочь рецензенту не терять фокус.


person agrum    schedule 23.01.2015    source источник
comment
Какая ОС? ГП? Драйверы? Qt скомпилирован с какой опцией OpenGL? Где твой вызов glewInit? (Как отдельная новость, Qt теперь предоставляет то же, что и GLEW, через QOpenGLContext::versionFunctions, QOpenGLExtensions и различные оболочки QOpenGL*)   -  person peppe    schedule 24.01.2015


Ответы (2)


Я использую glewInit() с Qt 5.4 в своем проекте, но в качестве базового класса я использую QWindow, а не QOpenGLWidget.

В моем ctor я делаю это:

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, и у меня не было проблем.

person Jherico    schedule 24.01.2015
comment
Я обновил свой код после вашего ответа и столкнулся с той же проблемой. Дайте мне знать, если я сделал что-то не так, или если у вас есть дополнительные предложения. Спасибо. - person agrum; 24.01.2015

На самом деле вы должны получить предупреждение об этом:

#warning qopenglfunctions.h не совместим с GLEW, определения GLEW будут неопределенными

#warning Чтобы использовать GLEW с Qt, не включайте glew.h или после него

Ваш «qopenglcontext.h» включает файлы . Чтобы ответить на ваш вопрос, вы можете использовать Qt + GLEW, но вы не можете легко перепутать Qt-opengl с GLEW.

person user3054986    schedule 18.03.2015