Qt für Windows - Grafikbeschleunigung

Für Qt Quick zu funktionieren, wird ein Grafiktreiber benötigt, der Direct 3D 11, Direct3D 12, Vulkan 1.0 oder OpenGL 2.1 oder höher unterstützt. Ab Qt 6 ist die Standardeinstellung für Qt Quick unter Windows Direct3D 11. Dies unterscheidet sich von Qt 5, wo die Vorgabe OpenGL war, entweder direkt oder über ANGLE, einen OpenGL-Direct3D-Übersetzer. ANGLE wird in Qt 6 nicht mehr mit Qt ausgeliefert.

Um die Verwendung des Direct3D Software-Rasterizers (WARP) zu erzwingen, setzen Sie die Umgebungsvariable QSG_RHI_PREFER_SOFTWARE_RENDERER auf 1. In einigen Fällen führt Qt Quick einen solchen Fallback automatisch durch, um die Ausführung von Qt-Anwendungen ohne zusätzliche Konfiguration zu ermöglichen. Dies geschieht, wenn die Treiber keine ausreichende D3D11-Funktionalität bieten, und tritt typischerweise in virtuellen Maschinen auf, in denen keine ordnungsgemäße GPU-Beschleunigung und kein Passthrough implementiert sind. Wenn Sie sich nicht sicher sind, welches Grafikgerät verwendet wird, und wenn Sie Probleme beheben oder an Qt melden möchten, führen Sie die Anwendung mit der Umgebungsvariablen QSG_INFO=1 aus und überprüfen Sie die Debug-Ausgabe. Die Ausführung des Tools qtdiag kann ebenfalls nützliche Informationen liefern, da es alle verfügbaren 3D-APIs auflistet.

Um die Verwendung von Vulkan, OpenGL oder Direct 3D 12 anzufordern, setzen Sie die Umgebungsvariable QSG_RHI_BACKEND auf vulkan oder opengl oder d3d12, oder verwenden Sie die entsprechende C++ API in main(). Beachten Sie, dass für einige dieser 3D-APIs die Installation der entsprechenden Treiber erforderlich sein kann.

Obwohl es nicht der Standard für Qt Quickist, wird OpenGL dennoch häufig in vielen Qt-Anwendungen verwendet, zum Beispiel in QWidget-basierten Anwendungen, die auf QOpenGLWindow oder QOpenGLWidget aufbauen. Die folgenden Abschnitte behandeln einige OpenGL-Spezifika eines Qt-Builds.

Dynamisches Laden von OpenGL

Qt unterstützt das Auswählen und Laden der OpenGL-Implementierung zur Laufzeit. Dieser Modus ist die Standardeinstellung und kann explizit angefordert werden, indem -opengl dynamic an das configure-Skript übergeben wird.

configure -opengl dynamic

Diese Konfiguration ist die flexibelste, da keine Abhängigkeiten oder Annahmen über die OpenGL-Implementierung während der Build-Zeit fest einkodiert sind. Sie ermöglicht eine robuste Anwendungsbereitstellung. Wenn eine bestimmte Umgebung keine geeignete OpenGL 2.0-Implementierung bereitstellt, wird automatisch eine Alternative zu opengl32.dll geladen, deren Standardname opengl32sw.dll ist. Die vorgefertigten Qt-Pakete enthalten ein Build von Mesa llvmpipe, einer Software-Rasterizer-Implementierung von OpenGL, unter diesem Namen.

Wenn es mit -opengl dynamic konfiguriert ist, werden weder Qt noch die mit qmake oder CMake erstellten Anwendungen mit opengl32.lib verknüpft. Stattdessen wird die Bibliothek zur Laufzeit ausgewählt und geladen. Standardmäßig ermittelt Qt, ob die opengl32.dll des Systems OpenGL 2-Funktionen bereitstellt. Wenn diese vorhanden sind, wird opengl32.dll verwendet, andernfalls wird versucht, opengl32sw.dll zu laden. Siehe unten für Details.

Der Lademechanismus kann über die Umgebungsvariable QT_OPENGL und die folgenden Anwendungsattribute konfiguriert werden:

  • Qt::AA_UseDesktopOpenGL Äquivalent zum Setzen von QT_OPENGL auf desktop.
  • Qt::AA_UseOpenGLES Hat keine Auswirkung in Qt 6.
  • Qt::AA_UseSoftwareOpenGL Entspricht dem Setzen von QT_OPENGL auf software.

Wenn eine bestimmte Konfiguration explizit angefordert wird, werden beim Start der Anwendung keine Prüfungen durchgeführt, d.h. die vom System bereitgestellte opengl32.dll wird nicht untersucht.

Das dynamische Laden hat eine erhebliche Auswirkung auf Anwendungen, die native OpenGL-Aufrufe enthalten: Sie können nicht gelinkt werden, da opengl32.lib nicht automatisch an den Linker weitergegeben wird. Stattdessen wird von den Anwendungen erwartet, dass sie die OpenGL-Funktionen über die Klasse QOpenGLFunctions verwenden. Dadurch wird die direkte Abhängigkeit von der OpenGL-Bibliothek aufgehoben und alle Aufrufe werden während der Laufzeit an die von Qt gewählte Implementierung weitergeleitet. Alternativ können Anwendungen auch direkte OpenGL-Funktionsaufrufe machen, wenn sie opengl32.lib zu ihren .pro-Projektdateien hinzufügen: LIBS += opengl32.lib (Visual Studio) oder LIBS += -lopengl32 (Mingw-w64). Das Ergebnis ist aus Sicht der Anwendung äquivalent zur -opengl desktop Build-Konfiguration von Qt.

Qt::AA_UseSoftwareOpenGL ist insofern besonders, als dass es versucht, eine OpenGL-Implementierung mit einem nicht standardisierten Namen zu laden. Der Standardname ist opengl32sw.dll. Dies ermöglicht die Auslieferung einer reinen Software-OpenGL-Implementierung, zum Beispiel ein Build von Mesa mit llvmpipe, unter diesem Namen. Falls erforderlich, kann der Dateiname durch Setzen der Umgebungsvariablen QT_OPENGL_DLL überschrieben werden.

Es ist möglich, eine Konfigurationsdatei im JSON-Format bereitzustellen, die angibt, welche OpenGL-Implementierung je nach Grafikkarte und Treiberversion verwendet werden soll. Der Speicherort wird durch die Umgebungsvariable QT_OPENGL_BUGLIST angegeben. Relative Pfade werden mit QLibraryInfo::SettingsPath oder QStandardPaths::ConfigLocation aufgelöst. Die Datei verwendet das Format der in The Chromium Projects verwendeten Treiber-Fehlerliste. Sie besteht aus einer Liste von Einträgen, von denen jeder eine Reihe von Bedingungen und eine Liste von Funktionsschlüsselwörtern angibt. Typischerweise werden Geräte-ID und Hersteller-ID verwendet, um eine bestimmte Grafikkarte zu finden. Sie können in der Ausgabe des Tools qtdiag6 oder dxdiag gefunden werden.

Die folgenden Feature-Schlüsselwörter sind für die Auswahl der OpenGL-Implementierung relevant:

Hinweis: In Qt 6 werden die alten ANGLE-bezogenen Schlüsselwörter (disable_angle, disable_d3d11, disable_d3d9) zwar akzeptiert, haben aber keine Auswirkungen.

  • disable_desktopgl - Deaktiviert OpenGL. Dies stellt sicher, dass Qt nicht versucht, reguläres OpenGL (opengl32.dll) zu verwenden, und dass es sofort mit ANGLE startet. Dies ist nützlich, um zu verhindern, dass schlechte OpenGL-Treiber die Anwendung zum Absturz bringen.
  • disable_rotation - Zwingt die Anwendung, immer im Querformat zu laufen. Es hat keinen Effekt, wenn eine Software-OpenGL-Implementierung verwendet wird. Dies ist für Treiber gedacht, die Probleme mit der Rotation haben.
  • disable_program_cache - Deaktivieren Sie das Speichern von Shader-Programm-Binärdateien auf der Festplatte.

Eine Beispieldatei sieht so aus:

{
"entries": [
{
  "id": 1,
  "description": "Disable D3D11 on older nVidia drivers",
  "os": {
    "type": "win"
  },
  "vendor_id": "0x10de",
  "device_id": ["0x0DE9"],
  "driver_version": {
    "op": "<=",
    "value": "8.17.12.6973"
  },
  "features": [
    "disable_d3d11"
  ]
},
...

Wenn QT_OPENGL_BUGLIST nicht angegeben ist, wird eine integrierte Liste verwendet. Dies schließt typischerweise einige ältere, weniger leistungsfähige Grafikkarten mit disable_desktopgl ein, um zu verhindern, dass Qt deren instabile Desktop-OpenGL-Implementierungen verwendet und stattdessen versucht, die softwarebasierte Alternativbibliothek sofort zu laden.

In der Praxis werden die folgenden Kombinationen am häufigsten vorkommen:

  • disable_desktopgl - Für den Fall, dass das System OpenGL 2.0 oder neuer bereitstellt, aber der Treiber als instabil und absturzgefährdet bekannt ist.
  • disable_desktopgl, disable_angle - Wenn kein beschleunigter Pfad gewünscht ist. Dies stellt sicher, dass die einzige Option, die Qt ausprobiert, der Software-Rasterizer (opengl32sw.dll) ist. Dies kann in virtuellen Maschinen und Anwendungen nützlich sein, die auf einer Vielzahl von alten Systemen eingesetzt werden.

Die unterstützten Schlüssel für den Abgleich mit einer bestimmten Karte oder einem bestimmten Treiber sind die folgenden. Beachten Sie, dass einige von ihnen spezifisch für Qt sind.

  • os.type - Betriebssystem: win, linux, macosx, android
  • os.version - Kernel-Version
  • os.release - Gibt eine Liste von Betriebssystemversionen unter Windows an: xp, vista, 7, 8, 8.1, 10.
  • vendor_id - Hersteller aus dem Adapter-Identifikator
  • device_id - Liste der PCI-Geräte-IDs.
  • driver_version - Treiberversion aus dem Adapterbezeichner
  • driver_description - Entspricht, wenn der Wert eine Teilzeichenkette der Treiberbeschreibung aus der Adapterkennung ist
  • gl_vendor - Stimmt überein, wenn der Wert eine Teilzeichenkette der Zeichenfolge GL_VENDOR ist.

Um das Blacklisting zu deaktivieren, setzen Sie die Umgebungsvariable QT_NO_OPENGL_BUGLIST auf einen beliebigen Wert. Dies überspringt das Lesen jeglicher Konfigurationsdateien und nimmt stattdessen an, dass nichts deaktiviert ist, unabhängig vom Treiber oder Betriebssystem.

Hinweis: Auch wenn dies in der Regel nicht erforderlich ist, kann QT_NO_OPENGL_BUGLIST in bestimmten virtuellen Umgebungen, in denen mehrere, möglicherweise virtuelle, Grafikkarten vorhanden sind, relevant werden. Wenn die Protokolle von Kategorien wie qt.qpa.gl darauf hinweisen, dass die Erkennung des Treibers und des Grafikadapters dazu führt, dass OpenGL fälschlicherweise deaktiviert wird, ist es empfehlenswert, diese Umgebungsvariable zu setzen, damit die Anwendung normal ausgeführt werden kann. Diese Umgebungsvariable wurde in Qt 5.15 eingeführt.

Direkte Abhängigkeit von opengl32.dll

Eine Alternative zu den standardmäßigen dynamic OpenGL-Builds ist die direkte Abhängigkeit von der opengl32.dll. Für diesen Modus übergeben Sie die Kommandozeilenoptionen -opengl desktop an das configure-Skript.

configure -opengl desktop

Hinweis: Die Verwendung von EGL und OpenGL ES wird unter Windows nicht unterstützt. In Qt 6 impliziert OpenGL unter Windows immer die Verwendung von WGL als Windowing-System-Schnittstelle.

In solchen Qt-Builds haben viele gemeinsam genutzte Qt-Bibliotheken und auch Qt-Anwendungen eine Abhängigkeit zu opengl32.dll, und daher ist die Verwendung einer alternativen Bibliothek nicht möglich.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.