2016-11-02 5 views
2

Ich habe eine QSurfaceFormat auf meinem Fenster, und dieses Oberflächenformat hat "3.0" als seine GL-Versionsnummer festgelegt. Der Code:Warum kann ich OpenGL ES 3.0 nicht in Qt verwenden?

static QSurfaceFormat createSurfaceFormat() { 
    QSurfaceFormat format; 
    format.setSamples(4); 
    format.setDepthBufferSize(24); 
    format.setStencilBufferSize(8); 
    format.setVersion(3, 0); 
    return format; 
} 

int main(int argc, char *argv[]) { 
    // ... 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
    QWindow* window = (QWindow*) engine.rootObjects().first(); 
    window->setFormat(::createSurfaceFormat()); 

    // ... 
} 

Auch in main() aktiviere ich OpenGL ES-Modus wie folgt aus:

QGuiApplication::setAttribute(Qt::AA_UseOpenGLES); 

Das bedeutet, ich bin die Beantragung eines GL ES 3.0 Kontext.

Die ANGLE docs sagen (in einer Tabelle nahe dem Anfang), dass GL ES 3.0 -> D3D 11 API Übersetzung Unterstützung implementiert ist. Und mein System unterstützt D3D 11 nach dxdiag.exe.

Aber wenn ich meine app starten, die diese QML-Code enthält ...

Text { 
    text: OpenGLInfo.majorVersion + "." + OpenGLInfo.minorVersion 
} 

... Ich sehe "2.0" angezeigt wird. Mit der von mir beschriebenen Methode here habe ich festgestellt, dass die maximal unterstützte Version der Schattierungssprache auf meinem PC "100" alias 1.0 ist.

Zur gleichen Zeit, von this Qt blog post Ich weiß, dass Qt GL ES 3.0-Anwendungen unterstützt.

Also Warum kann ich OpenGL ES 3.0 nicht in Qt verwenden?

+0

* I eine QSurfaceFormat gesetzt auf meinem Fenster, und dieses Oberflächenformat hat "3.0" als seine GL-Versionsnummer * Wie machst du das genau? Von welcher Fensterklasse sprichst du? – peppe

+0

@peppe: Ich habe die Frage bearbeitet, um diese Informationen einzubeziehen. –

+1

Die in den Code eingefügte Art und Weise sieht falsch aus, da das Format * nach * der Erstellung des Fensters eingestellt wird (und das ist zu spät, müssen Sie es vorher einstellen). Versuchen Sie, 'QSurfaceFormat :: setDefaultFormat' zu setzen, bevor Sie Ihr' Q (Gui) Application'-Objekt in main erstellen. – peppe

Antwort

4

Sie müssen ein QSurfaceFormat auf einem QWindow festlegen, bevor das Fenster selbst erstellt wird (über create()). Wenn Sie Top-Level-Fenster über QML erstellen Sie keine Kontrolle über haben, wenn create() tatsächlich aufgerufen wird, so wird eine Lösung, die die Standard-Oberfläche Formatwechsel somwhere, bevor Sie Ihre Q (Gui) Anwendung erstellen:

int main(int argc, char **argv) { 
    // createSurfaceFormat() is the function you pasted above 
    QSurfaceFormat::setDefaultFormat(createSurfaceFormat()); 

    QApplication app(argc, argv); 
    // etc. 
Verwandte Themen