2013-08-24 1 views
1

Linux에서 Windows로 이전 Qt/OpenGL 게임을 이식하려고합니다. Qt Creator를 사용하고 있습니다. 즉시 컴파일되었지만 연결 단계에서 많은 오류가 발생했습니다 (undefined reference to '[email protected]').QGLWidget을 사용할 때 gl 함수에 대한 정의되지 않은 참조

더 많은 lib-lopengl32 -lglaux -lGLU32 -lglut -lglew32을 연결하려고 시도했지만 동일한 결과가 나타납니다.

Qt도 기본값으로 -lQt5OpenGLd을 사용합니다. 내가 가진 QGLWIdget 포함하고있어

:

#define GL_GLEXT_PROTOTYPES 
#include <QGLWidget> 

는 또한 GLEW를 사용하여 시도했지만 그것은 Qt를 함께 confilcts (또는 QOpenGL?).

어떻게 정의되지 않은 참조를 제거 할 수 있습니까? 내가 링크해야하는 다른 라이브러리가 있습니까?

미리 감사드립니다.

Tomxey

+2

Windows는 opengl32.dll에서 GL1.1 이상을 수출하지 않습니다. 당신이 한'#define GL_GLEXT_PROTOTYPES'는 리눅스에서 작동한다는 보장조차되지 않은 해킹 이었지만 윈도우에서는 결코 작동하지 않을 것입니다. 런타임시 수동으로 또는 glew와 같은 일부 도우미 라이브러리를 통해 함수 포인터를 쿼리해야합니다. 그러나 Qt에 대해 충분히 알지 못하며이 질문에 대한 실질적인 답변을 제공하는 GL 위젯입니다. – derhass

답변

4

윈도우의 OpenGL 1.1 이후에 도입 OpenGL을 함수의 프로토 타입을 제공하지 않습니다. 런타임에 이러한 함수에 대한 포인터를 (해결하려면 GetProcAddress 이상 - QOpenGLContext::getProcAddress, 아래 참조) 해결해야합니다.


Qt는이 작업을 쉽게하기 위해 우수한 블러을 제공합니다

  • QOpenGLShaderQOpenGLShaderProgram 당신이 당신의 쉐이더, 쉐이더 프로그램, 그들의 유니폼을 관리 할 수 ​​있습니다.

  • QOpenGLContext::functions() 수익률 (확장 고유의 기능을로드 QOpenGLContext::hasExtension()와 함께 유용)

    QMatrix4x4 modelMatrix = model->transform(); 
    QMatrix4x4 modelViewMatrix = camera->viewMatrix() * modelMatrix; 
    QMatrix4x4 modelViewProjMatrix = camera->projMatrix() * modelViewMatrix; 
    ... 
    program->setUniform("mv", modelViewmatrix); 
    program->setUniform("mvp", modelViewProjMatrix); 
    
  • QOpenGLContext::getProcAddress()는 플랫폼 독립적 인 기능의 해결을 : QOpenGLShaderProgram 좋은 과부하가 원활 QVector<N>D 또는 QMatrix<N>x<N> 클래스를 통과 할 수 있도록 제공 QOpenGLFunctions 객체 (컨텍스트 소유). 공개 API로 OpenGL 2 (+ FBO)/OpenGL ES 2 사이의 공통 하위 집합을 제공합니다 .¹ 씬 뒤에서 포인터를 해결하므로 수행해야하는 것은

    , 다른 방법으로 당신을

    QOpenGLFunctions_3_3_Core *functions = 0; 
    functions = context->versionFunctions<QOpenGLFunctions_3_3_Core>(); 
    if (!functions) 
        error(); // context doesn't support the requested version+profile 
    functions->initializeOpenGLFunctions(context); 
    
    functions->glSamplerParameterf(...); // OpenGL 3.3 API 
    functions->glPatchParameteri(...); // COMPILE TIME ERROR, this is OpenGL 4.0 API 
    
  • :

    functions->glUniform4f(...); 
    
  • QOpenGLContext::versionFunctions<VERSION>()QAbstractOpenGLFunctions 서브 클래스, 즉하여 VERSION 템플릿 매개 변수와 일치하는 하나 (또는 ​​NULL이 요청이 만족 될 수없는 경우)을 반환합니다 QOpenGLFunctionsX에서 "드로잉"클래스/상속 /을 만들 수 있습니다.당신은 평소와 같이 그들을 initalize 수 있지만,이 방법 당신은 같은 코드를 유지할 수 있습니다 :

    class DrawThings : public QObject, protected QOpenGLFunctions_2_1 
    { 
        explicit DrawThings(QObject *parent = 0) { ... } 
        bool initialize(QOpenGLContext *context) 
        { 
         return initializeOpenGLFunctions(context); 
        } 
        void draw() 
        { 
         Q_ASSERT(isInitialized()); 
         // works, it's calling the one in the QOpenGLFunctions_2_1 scope... 
         glUniform4f(...); 
        } 
    } 
    

¹ QtOpenGL 모듈에서 "일치"클래스도있다 즉 QGLContextQGLFunctions. 가능한 경우 새로운 코드에서 QtOpenGL을 사용하지 마십시오. 두 버전에서 QOpenGL* 클래스를 사용하는 것이 좋습니다.