Auf dieser Seite

Shadergen-Tool

Das Shadergen-Tool ist eine Befehlszeilenanwendung, die Teil der Asset-Aufbereitungspipeline von „ Qt Quick 3D “ ist. Es kann projektbezogen aktiviert oder manuell über die Befehlszeile ausgeführt werden. Das Vorabgenerieren der Material-Shader kann sich erheblich auf die Startzeit auswirken und/oder unerwünschte Verzögerungen zur Laufzeit vermeiden, da die Erstellung eines Material-Shaders zur Laufzeit rechenintensiv sein kann.

Hinweis: Dieses Tool war experimentell und wird nun nicht mehr unterstützt. Bereits vorhandene Funktionen bleiben unverändert bestehen, es werden jedoch keine neuen Funktionen oder Fehlerbehebungen mehr hinzugefügt.

Eines der größten Hindernisse für den Offline-Shader-Generator ist die Vielzahl der verschiedenen Materialien, die generiert werden können – nicht nur basierend auf den Materialeigenschaften selbst, sondern auch darauf, wie der Rest der Szene eingerichtet ist; beispielsweise beeinflussen die Anzahl der Lichtquellen, der Lichttyp, Schatten usw. die generierten Shader. Berücksichtigt man zudem dynamische Eigenschaften, kann die schiere Anzahl an Material-Shader-Kombinationen sehr schnell dazu führen, dass es nicht mehr machbar ist, alle bereits zur Erstellungszeit zu generieren. Um die Anzahl der Shader zu begrenzen, die das Tool generieren muss, versucht es, nur die Shader zu generieren, von denen es annimmt, dass die Anwendung sie benötigt. Die im Tool verwendeten Heuristiken können möglicherweise nicht immer erkennen, welche Materialien generiert werden sollten; dies gilt insbesondere für Eigenschaften, die sich zur Laufzeit ändern. Um zu überprüfen, ob die Material-Shader erfolgreich und korrekt generiert wurden, sollte das Tool eine .qsbc-Datei erzeugt haben, die überprüft werden kann, um sicherzustellen, dass der Inhalt mit dem von der Anwendung verwendeten Material übereinstimmt. Es ist außerdem möglich, zu überprüfen, ob das Material aus dem vorab erstellten Cache geladen wurde, indem man die Umgebungsvariable `QT_RHI_SHADER_DEBUG=1` setzt und in der Debug-Ausgabe nach Hinweisen darauf sucht, dass die Engine den vorab generierten Shader erfolgreich geladen hat.

Bekannte Einschränkungen sind:

  • Szenen mit mehr als einem „ View3D “.
  • Das dynamische Hinzufügen oder Entfernen von Lichtquellen wird bei der Verwendung generierter Materialien nicht unterstützt.
  • Die generierten Shader sind aufgrund ihrer Abhängigkeit von den internen Abläufen des Renderers streng an die verwendete Qt-Version gebunden. Die Kompatibilität der generierten Shader zwischen verschiedenen Versionen kann daher nicht garantiert werden.

Verwendung

Um die Offline-Generierung von Material-Shadern in Ihrem Projekt zu aktivieren, fügen Sie Folgendes zu Ihrer Projektdatei hinzu:

CMake:

qt6_add_materials(offlineshaders "shaders"
    PREFIX
        "/"
    FILES
        ${qml_resource_files}
)

Alternativ kann das Tool „shadergen“ manuell über die Befehlszeile wie folgt aufgerufen werden:

shadergen main.qml Material.qml

Normalerweise sollte das „shadergen“-Tool aus dem Projektordner Ihrer Anwendung heraus ausgeführt werden, es ist jedoch auch möglich, dem Tool über das Argument „ -C “ mitzuteilen, sein aktuelles Arbeitsverzeichnis zu ändern.

Wird kein Ausgabepfad angegeben, schreibt das Tool die generierten Dateien in das aktuelle Verzeichnis. Der Ausgabepfad kann mit der Option „ -o “ geändert werden.

Beachten Sie, dass das Tool, um die erwarteten Materialien zu generieren, die gesamte Szene kennen muss und nicht nur die Materialien. Beispielsweise beeinflusst auch die Anzahl der Lichtquellen in der Szene, wie die Materialien generiert werden. Daher sollten alle relevanten QML-Dateien zur Liste der Dateien hinzugefügt werden, die das Tool verarbeiten muss.

Befehlszeilenargumente

KurzVollBeschreibung
-C <PATH>–directory <PATH>Wechselt in das Verzeichnis „ <PATH> “. Dieses Argument ist optional.
-o <PFAD>–output-dir <PATH>Legt den Ausgabepfad auf <PATH> fest. Dies ist der Speicherort, an dem die vom Tool erzeugten Dateien abgelegt werden. Wenn kein Pfad angegeben wird, ist der Pfad das aktuelle Verzeichnis.
-r <NAME>–resource-file <NAME>Ändert den Namen der generierten Ressourcendatei in „ <NAME> “. Dieses Argument ist optional.
-l <DATEI>–list-qsbc <DATEI>Listet den Inhalt der qsbc-Datei auf.

Generierter Inhalt

Die Hauptausgabedatei der shadergen-Tools ist eine .qsbc-Datei. Die .qsbc-Datei enthält eine Sammlung von .qsb-Dateien sowie einige Metadaten zu den verschiedenen Material-Shadern, wie beispielsweise die eindeutige Eigenschaftszeichenfolge für jedes Material. Um den Inhalt der .qsbc-Datei zu überprüfen, können Sie das Argument „ -l “ mit dem shadergen-Tool wie folgt verwenden:

shadergen -l qtappshaders.qsbc

Dynamische Eigenschaften

Da das Tool zur Erstellungszeit ausgeführt wird, kann es nur begrenzt berücksichtigen, welche Eigenschaften sich zur Laufzeit ändern könnten. Eigenschaften, deren Wert sich nur innerhalb des zulässigen Bereichs ändert – wie beispielsweise der Rauheitswert –, haben keinen Einfluss auf den generierten Material-Shader. Eigenschaften, die jedoch entweder aktiviert oder deaktiviert werden können – wie z. B. das Festlegen einer Image-Map zur Laufzeit –, erfordern die Generierung eines anderen Materialtyps. Es wird daher empfohlen, alle Varianten eines Materials, die Funktionen im Material oder in der Szene aktivieren oder deaktivieren, als einzelne Komponenten zu deklarieren; dies hilft dem Tool dabei, die richtigen Material-Shader zu generieren.

Das folgende Beispiel zeigt ein konstruiertes Beispiel für ein Material, bei dem wir einem Material zur Laufzeit eine Grundfarbkarte hinzufügen möchten. Beachten Sie, dass die Komponente „ MaterialRedExtended “ im Beispiel nie verwendet wird; sie ist lediglich definiert, um dem Shadergen-Tool dabei zu helfen, die Shader zu generieren, die benötigt werden, um die „ baseColorMap “ zur Laufzeit dynamisch festzulegen.

MaterialRed.qml

PrincipledMaterial {
    baseColor: "red"
    lighting: PrincipledMaterial.NoLighting
}

MaterialRedExtended.qml

MaterialRed {
    baseColorMap: Texture {
        source: "maps/metallic/basecolor.jpg"
    }
}

main.qml

Model {
    position: Qt.vector3d(0, -30, 0)
    scale: Qt.vector3d(4, 4, 4)
    source: "#Sphere"
    materials: MaterialRed {
        id: redMaterial
    }
MouseArea {
    anchors.fill: parent
    onClicked: {
    if (redMaterial.baseColorMap === null)
        redMaterial.baseColorMap = baseColorMap
    else
        redMaterial.baseColorMap = null
    }
}

Siehe auch QtShaderTools.

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