Qt Shader Tools Überblick

Das Qt Shader Tools Modul baut auf dem SPIR-V Open Source Ecosystem auf, wie auf der Khronos SPIR-V Website beschrieben. Zum Kompilieren in SPIR-V wird glslang verwendet, während das Übersetzen und Reflektieren über SPIRV-Cross erfolgt.

Damit Shader-Code einmal in Qt-Anwendungen und -Bibliotheken geschrieben werden kann, wird erwartet, dass alle Shader in einer einzigen Sprache geschrieben werden, die dann in SPIR-V kompiliert wird. Diese Shading-Sprache ist im Moment Vulkan-kompatibles GLSL. Dies unterscheidet sich von dem GLSL im OpenGL-Stil, das Qt 5.x erwartet. Siehe die GL_KHR_vulkan_glslspecification für einen Überblick über die Unterschiede.

Der Quellcode für andere Schattierungssprachen wie GLSL, HLSL und die Metal Shading Language wird dann aus der Übersetzung des SPIR-V-Bytecodes zusammen mit den Reflexionsinformationen (Eingänge, Ausgänge, Shader-Ressourcen) generiert. Insbesondere für GLSL bedeutet dies auch, dass mehrere Varianten generiert werden, d. h. Quellcode, der für verschiedene GLSL-Versionen geeignet ist, z. B. GLSL ES 100, GLSL ES 300, GLSL 120 und 150. Dieser wird dann in serialisierbare QShader Containerobjekte gepackt, die typischerweise als .qsb Dateien auf der Festplatte gespeichert werden. Das Qt Rendering Hardware Interface verbraucht QShader Instanzen direkt und wählt die Shader-Quelle oder den Bytecode aus, der am besten für die zur Laufzeit verwendete Grafik-API geeignet ist. Ein QShader Objekt wird normalerweise aus .qsb Dateien, die mit der Anwendung oder Qt selbst ausgeliefert werden, im Qt Resource System deserialisiert.

Einige Plattformen bieten die Möglichkeit, den Shader-Quellcode in ein Zwischenformat ähnlich SPIR-V zu kompilieren. Dazu müssen plattformspezifische Tools ausgeführt werden. Bei Direct 3D bietet das Tool qsb die Möglichkeit, das Tool fxc aus dem Windows SDK aufzurufen, sobald der HLSL-Quellcode generiert wurde. Es ersetzt dann den HLSL-Quellcode durch die von fxc generierte DXBC -Binärdatei. Dies kann sich positiv auf die Laufzeitleistung der Anwendungen auswirken, da sie die erste Phase der Kompilierung (HLSL-Quellcode zu DXBC) nicht mehr selbst durchführen müssen. Für macOS und iOS bietet das XCode SDK ähnliche Tools. Der Nachteil dieses Ansatzes ist, dass diese Tools nur auf den jeweiligen Plattformen ausgeführt werden können. Daher eignet sich dieser Ansatz am besten für die Verwendung in Kombination mit der CMake-Integration von qsb, da die Shader-Konditionierung während der Anwendungserstellung implizit mit dem erforderlichen Wissen über die Zielplattform einhergeht und welche plattformspezifischen Tools aufgerufen werden können.

Das folgende Diagramm beschreibt die Schritte, die während eines Aufrufs des qsb Tools passieren:

Die Hauptkomponenten des Qt-Shader-Konditionierungssystems sind:

  • das qsb Kommandozeilen-Tool
  • CMake-Integration für das qsb Tool
  • QShader (Teil des Moduls QtGui )
  • QShaderBaker (Teil dieses Moduls, das Bibliotheksäquivalent des qsb -Tools)

Typische Verwendung mit Qt Quick

Anwendungsentwickler arbeiten typischerweise mit benutzerdefiniertem Shader-Code in Qt Quick -Szenen, die eines der folgenden Merkmale aufweisen:

  • ShaderEffect Elemente
  • QQuickItem Unterklassen, die Szenengraph-Knoten in Kombination mit benutzerdefinierten Materialien verwenden, die durch Unterklassen von QSGMaterial erstellt wurden.

Betrachten Sie zum Beispiel das folgende QML-Snippet:

ShaderEffect {
    width: 100; height: 100
    fragmentShader: "myeffect.frag.qsb"
}

Hier verweist die URL fragmentShader auf eine Datei .qsb relativ zum Speicherort der Datei .qml. Von der Anwendung wird erwartet, dass sie myeffect.frag.qsb neben der Datei .qml ausliefert. Um diese Datei aus dem GLSL-Quellcode im Vulkan-Stil zu erzeugen (der selbst nicht mit der Anwendung ausgeliefert werden muss), muss die Anwendung das Tool qsb entweder direkt oder über CMake verwenden.

Typische Verwendung mit Qt Quick 3D

Qt Quick 3D verwendet das Modul Shader Tools direkt, um die Shader-Konditionierung zur Laufzeit durchzuführen. Darüber hinaus bietet es Lösungen für die Vorgenerierung von Shadern für Materialien zur Erstellungszeit, für den Fall, dass eine Laufzeitabhängigkeit von Shader-Compilern und anderen Tools nicht als ideal angesehen wird. In beiden Fällen müssen die Entwickler nicht direkt mit dem Tool qsb arbeiten, da es durch das eigene Framework und die Tools von Qt Quick 3D gekapselt ist.

© 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.