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 vonQT_OPENGL
aufdesktop
.Qt::AA_UseOpenGLES
Hat keine Auswirkung in Qt 6.Qt::AA_UseSoftwareOpenGL
Entspricht dem Setzen vonQT_OPENGL
aufsoftware
.
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-Versionos.release
- Gibt eine Liste von Betriebssystemversionen unter Windows an:xp
,vista
,7
,8
,8.1
,10
.vendor_id
- Hersteller aus dem Adapter-Identifikatordevice_id
- Liste der PCI-Geräte-IDs.driver_version
- Treiberversion aus dem Adapterbezeichnerdriver_description
- Entspricht, wenn der Wert eine Teilzeichenkette der Treiberbeschreibung aus der Adapterkennung istgl_vendor
- Stimmt überein, wenn der Wert eine Teilzeichenkette der ZeichenfolgeGL_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.