2012-06-12 6 views
9

nicht einstellen Ich versuche QGLWidget in Qt 4.8.2 zu verwenden. Ich habe bemerkt, dass der Standardkontext, den QGLWidget erstellt, keine Ausgabe für OpenGL über 3.1 zeigt. The Qt wiki has a tutorial zeigt, dass mit OpenGL 3.3 ein einfaches Dreieck gezeichnet wird. Wenn ich versuche, das Tutorial auszuführen, bekomme ich einen leeren Bildschirm. Wenn ich die OpenGL-Version auf 3.1 ändere, bekomme ich die erwartete Ausgabe (ein rotes Dreieck).Kann gewünschte OpenGL-Version in QGLWidget

Meine Grafikkarte unterstützt OpenGL 4.2, und das Aufrufen von QGLFormat::openGLVersionFlags() vor dem Erstellen des QGLWidget zeigt, dass Qt OpenGL 4.2 und alle früheren Desktopversionen erkennt.

Hier ist ein weiteres Beispiel minimal:

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

Hier ist der Ausgang:

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) 

Die QFlags() Aufzählungsliste in der ersten Zeile werden die OpenGL-Versionen unterstützt. Die Liste zeigt, dass ich alle Varianten mit Ausnahme von OpenGL/ES Versionen unterstütze. QFlags() in der dritten Zeile beschreibt Formatoptionen (Alphakanal, Stencil-Puffer usw.).

Wer weiß, warum QGLWidget mit nichts> = 3.1 funktioniert? Ich bin auf Linux, habe eine Nvidia GT440, und glxinfo zeigt, dass es OpenGL 4.2.0 unterstützt. Die Treiberversion wird in der obigen Beispielausgabe gedruckt. Ich bin mir nicht sicher, was ich sonst noch versuchen sollte.

Edit: Ich machte einige ziemlich schlechte Fehler/Annahmen mit meiner Erklärung des Problems vor dieser Bearbeitung. Das Problem ist immer noch ähnlich, aber hoffentlich macht es jetzt ein bisschen mehr Sinn. Entschuldigung für jede Verwirrung.

+0

Sind Ihre Shader kompilieren/verknüpfen? Wenn Sie einen 4.2-Kontext und inkompatible/falsche Shader verwenden, ist dies ein Grund für ein leeres Fenster. –

+0

Ich bin noch nicht so weit (Shaders). Ich wollte QGLWidget als Ansichtsfenster für eine QDeclarativeView verwenden und dann 3D-Inhalte hinzufügen, die Shader verwenden. Aber selbst eine einfache Datei mit Standardkomponenten wie einem Rectangle {} rendert nichts.Es wird wie erwartet dargestellt, wenn ich die QGLFormat Version nicht setze, aber der ganze Punkt dieser Frage ist herauszufinden, warum ich es nicht an erster Stelle setzen kann. Außerdem würde ich Fehler bekommen, wenn ich (oder Qt intern) inkompatible Shader benutze. Die einzige Ausgabe ist, was ich in meine Frage eingefügt habe. – Prismatic

+0

Hmm, der einzige Grund, warum ich vorschlage, das Shader-Protokoll zu betrachten, ist, dass OpenGL 3.0 + erfordert, dass Ihre eigenen Shader kompiliert und geladen werden, während OpenGL 2.0 und darunter nicht funktionieren. Ich habe keine Erfahrung mit der Verwendung von OpenGL durch QT, so weiß ich nicht, wie viel für Sie behandelt wird. In dem von Ihnen verlinkten Beispiel bereitet der Autor jedoch eigene Shader vor. Wenn Sie der Grafikkarte keine Shader mit dem Core-Profil bereitstellen, werden Sie nichts rendern. –

Antwort

4

Sie sollten die OpenGL-Abfragen nach mainView.show(); verschieben. Vor show() wurde der OpenGL-Kontext nicht initialisiert.

2

Kurzversion: Update auf Qt5, es ist dort behoben.

P.S Und wenn Sie 5.4 verwenden können, sollten Sie wahrscheinlich QtOpenGL ... Klassen anstelle von QGL ... Einsen verwenden.

Lange Version: Also, falls jemand jemals auf ein Problem wie dieses stoßen sollte.

Ich habe versucht, NOT OpenGL 3.0 Kontext mit meinem Intel HD3000 auf Ubuntu 14.04 und Qt 4.8.6 zu erstellen. Ich habe diesen Testcode am Ende der Antwort gefunden. Versucht, 3.1, 1.2, 2.1 .. etc. Kontexte zu erstellen Core Compatible .. aber immer am Ende mit context->format().majorVersion() zeigt die angeforderte Version und glGetString(GL_VERSION) zeigt 3.0.

Nach ca. 3 Stunden habe ich gemerkt, dass Qt Creator standardmäßig Qt4 anstelle des letzten Qt 5 verwendet, der auf meinem System installiert ist. Und nachdem ich das Projekt mit Qt 5.2.1 neu kompiliert habe, hat genau der gleiche Code wie erwartet funktioniert.

Hoffe, das kann jemand helfen.

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(); 
} 
Verwandte Themen