2012-06-12 3 views
9

Qt 4.8.2에서 QGLWidget을 사용하려고합니다. QGLWidget이 생성 한 기본 컨텍스트가 3.1 이상의 OpenGL에 대한 출력을 표시하지 않는 것으로 나타났습니다. The Qt wiki has a tutorial은 OpenGL 3.3을 사용하여 간단한 삼각형을 그리는 방법을 보여줍니다. 튜토리얼을 실행하려고하면 빈 화면이 나타납니다. OpenGL 버전을 3.1로 변경하면 예상되는 출력 (빨간색 삼각형)이 나타납니다.QGLWidget에서 원하는 OpenGL 버전을 설정할 수 없습니다.

내 비디오 카드는 OpenGL 4.2를 지원하며 QGLWidget을 만들기 전에 QGLFormat::openGLVersionFlags()을 호출하면 Qt가 OpenGL 4.2 및 이전의 모든 데스크톱 버전을 감지한다는 것을 알 수 있습니다. 여기

#include <QApplication> 
#include <QGLWidget> 
#include <QDebug> 
#include <QtDeclarative/qdeclarativeview.h> 

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

    qDebug() << "OpenGL Versions Supported: " << QGLFormat::openGLVersionFlags(); 

    QGLFormat qglFormat; 
    qglFormat.setVersion(4,2); // get expected output with (3,1) and below, else blank window 
    qglFormat.setProfile(QGLFormat::CoreProfile); 
    qglFormat.setSampleBuffers(true); 

    QGLWidget* qglWidget = new QGLWidget(qglFormat); 

    QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION)))); 
    qDebug() << "Driver Version String:" << versionString; 
    qDebug() << "Current Context:" << qglWidget->format(); 

    QDeclarativeView mainView; 
    mainView.setViewport(qglWidget); 
    mainView.setSource(QString("helloworld.qml")); 
    mainView.show(); 

    return app.exec(); 
} 

를 출력이다 :

여기서 최소한 다른 예가

OpenGL Versions Supported: QFlags(0x1|0x2|0x4|0x8|0x10|0x20|0x40|0x1000|0x2000|0x4000|0x8000|0x10000) 
Driver Version String: "4.2.0 NVIDIA 295.53" 
Current Context: QGLFormat(options QFlags(0x1|0x2|0x4|0x10|0x20|0x80|0x200|0x400) , plane 0 , depthBufferSize 24 , accumBufferSize 16 , stencilBufferSize 8 , redBufferSize 8 , greenBufferSize 8 , blueBufferSize 8 , alphaBufferSize -1 , samples 4 , swapInterval 0 , majorVersion 4 , minorVersion 2 , profile 1) 

첫 줄에 QFlags() ENUM리스트 지원 OpenGL의 버전을 설명한다. 이 목록은 OpenGL/ES 버전을 제외한 모든 변형을 지원함을 보여줍니다. 세 번째 줄의 QFlags()는 형식 옵션 (알파 채널, 스텐실 버퍼 등)을 설명합니다.

누구나 QGLWidget이> = 3.1 이상으로 작동하지 않는 이유를 알고 계십니까? 나는 리눅스에 있고, 엔비디아 GT440을 가지고 있으며, glxinfo는 OpenGL 4.2.0을 지원함을 보여줍니다. 드라이버 버전은 위의 샘플 출력에 인쇄되어 있습니다. 나는 그 밖의 무엇을 시도해야하는지 너무 확신하지 못한다.

편집 :이 편집하기 전에 문제에 대한 설명과 함께 꽤 나쁜 실수/가정을했습니다. 이 문제는 여전히 유사하지만 잘하면 조금 더 이해할 수 있습니다. 혼란스러워서 죄송합니다.

+0

쉐이더를 컴파일하고 있습니까? 4.2 컨텍스트 및 호환되지 않는 셰이더 또는 잘못된 셰이더를 사용하는 경우 이는 빈 창이 원인이됩니다. –

+0

나는 아직까지는 (쉐이더들) 그것을 얻지 못했다. QDeclarativeView에 대한 뷰포트로 QGLWidget을 사용한 다음 셰이더를 사용하는 3D 콘텐츠를 추가하려고했습니다. 그러나 Rectangle {}과 같은 기본 구성 요소가있는 간단한 파일조차도 아무 것도 렌더링하지 않습니다.QGLFormat 버전을 설정하지 않으면 예상대로 렌더링되지만이 질문의 요점은 왜 처음에 설정할 수 없는지를 파악하는 것입니다. 게다가 (또는 Qt 내부적으로) 호환되지 않는 셰이더를 사용하면 오류가 발생합니다. 유일한 결과는 내 질문에 붙여 넣은 것입니다. – Prismatic

+0

음, 쉐이더 로그를 보는 것이 유일한 이유는 OpenGL 3.0 이상에서 OpenGL 2.0 이하는 자신의 쉐이더가 컴파일되고로드되어야한다는 것입니다. QT를 통해 OpenGL을 사용하는 것에 대한 경험이 없으므로 어느 정도 처리되는지 알지 못합니다. 그러나 링크 된 예제에서 작성자는 자신의 쉐이더를 준비합니다. 코어 프로파일을 사용하여 그래픽 카드에 쉐이더를 제공하지 않으면 아무 것도 렌더링하지 않습니다. –

답변

4

mainView.show(); 다음에 OpenGL 쿼리를 이동해야합니다. show() 이전에는 OpenGL 컨텍스트가 초기화되지 않았습니다.

2

짧은 버전 : Qt5로 업데이트하면 해결됩니다.

P.S 그리고 5.4를 사용할 수 있다면 QGL ... 대신 QtOpenGL ... 클래스를 사용해야합니다.

긴 버전 : 누구나 이런 문제가 생길 수 있습니다.

우분투 14.04 및 Qt 4.8.6에서 Intel HD3000으로 OpenGL 3.0 컨텍스트를 만들려고했습니다. 나는이 테스트 코드를 대답의 끝에 제공했다. 3.1, 1.2, 2.1 등의 컨텍스트를 만들려고 했음 Core Compatible ..하지만 항상 요청한 버전을 표시하는 context->format().majorVersion()으로 끝나고 glGetString(GL_VERSION)은 3.0을 표시합니다.

약 3 시간 후에 Qt Creator가 기본적으로 최근 Qt 5 대신 Qt4를 사용한다는 사실을 알게되었습니다. 그리고 Qt 5.2.1로 프로젝트를 다시 컴파일 한 후에 정확히 동일한 코드가 예상대로 작동하기 시작했습니다.

희망이 있으면 도움이 될 수 있습니다.

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

    MainWindow w; 
    w.show(); 

    QGLFormat glFormat; 
    glFormat.setVersion(3, 1); 
    glFormat.setProfile(QGLFormat::NoProfile); 
    glFormat.setSampleBuffers(true); 
    glFormat.setDefaultFormat(glFormat); 
    glFormat.setSwapInterval(1); 
    QGLWidget widget(glFormat); 
    widget.makeCurrent(); 

    const QGLContext *context = widget.context(); 

    glewExperimental = GL_TRUE; 
    if (glewInit() != GLEW_OK) { 
     qWarning("Failed to initialize GLEW\n"); 
    } 
    qDebug() << "Context valid: " << context->isValid(); 
    qDebug() << "Really used OpenGl: " << context->format().majorVersion() << "." << context->format().minorVersion(); 
    qDebug() << "OpenGl information: VENDOR:  " << (const char*)glGetString(GL_VENDOR); 
    qDebug() << "     RENDERDER: " << (const char*)glGetString(GL_RENDERER); 
    qDebug() << "     VERSION:  " << (const char*)glGetString(GL_VERSION); 
    qDebug() << "     GLSL VERSION: " << (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION); 
    qDebug() << "endstuff\n"; 

    return a.exec(); 
} 
관련 문제