2015-01-23 4 views
0

프로젝트를 Qt 4.8에서 5.4로 마이그레이션하고 있습니다. 다중 스레드에서 다중 컨텍스트를 사용합니다. 우리는이 목적을 위해 GLEW MX를 사용합니다 (현재 원하는 컨텍스트를 만든 다음 GLEWContextStruct의 로컬 인스턴스에서 glewInit()을 호출합니다).Qt5 및 GLEW MX => glewInit 실패

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

어떤 제안을? Qt5.4에서 GLEW는 괜찮습니까?

편집 1 :

문제는 QT와 관련이없는 것으로 보입니다. 생성 된 GLEWContext에는 앞으로 정의 된 함수가 없습니다 (모든 함수 포인터는 정의되지 않습니다). 리뷰어가 포커스를 잃지 않도록 코드가 업데이트되었습니다.

+0

어떤 OS입니까? GPU? 운전자? Qt는 OpenGL 옵션으로 컴파일 되었습니까? 니가 전화 했어? (별도의 뉴스로서 Qt는 QOpenGLContext :: versionFunctions, QOpenGLExtensions 및 다양한 QOpenGL * 래퍼를 통해 GLEW가 제공하는 것을 제공합니다. – peppe

답변

0

내 프로젝트에서 glewInit()을 Qt 5.4와 함께 사용하지만 QOpenGLWidget이 아닌 QWindow를 기본 클래스로 사용하고 있습니다. 내의 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과 완전히 동일한 설정을 수행했지만 문제가 없었습니다.

+0

답변에 따라 코드를 업데이트하고 같은 문제가 발생했습니다. 제가 잘못했거나 추가 제안이 있다면 알려주십시오. 감사. – agrum

0

당신은 실제로 대한 경고 얻어야한다 :

# 회신의 qopenglfunctions.h이 GLEW와 호환되지 않습니다를 GLEW는 포함되어 있지 않습니다 Qt를 함께 GLEW를 사용하려면

# 회신, 이후를 정의되지 않습니다 정의 glew.h

"qopenglcontext.h"에 포함됩니다. 질문에 대답하기 위해 Qt + GLEW를 사용할 수 있지만 Qt-opengl과 GLEW를 쉽게 섞을 수는 없습니다.