Auf dieser Seite

QShader Class

Enthält mehrere Versionen eines Shaders, die in verschiedene Shading-Sprachen übersetzt wurden, zusammen mit Metadaten zur Reflexion. Mehr...

Header: #include <qshader.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Seit: Qt 6.6

Öffentliche Typen

struct NativeShaderInfo
struct SeparateToCombinedImageSamplerMapping
NativeResourceBindingMap
SeparateToCombinedImageSamplerMappingList
enum class SerializedFormatVersion { Latest, Qt_6_5, Qt_6_4 }
enum Source { SpirvShader, GlslShader, HlslShader, DxbcShader, MslShader, …, WgslShader }
enum Stage { VertexStage, TessellationControlStage, TessellationEvaluationStage, GeometryStage, FragmentStage, ComputeStage }
enum Variant { StandardShader, BatchableVertexShader, UInt16IndexedVertexAsComputeShader, UInt32IndexedVertexAsComputeShader, NonIndexedVertexAsComputeShader, HdrCapableFragmentShader }

Öffentliche Funktionen

QShader()
QShader(const QShader &other)
(since 6.7) QShader(QShader &&other)
~QShader()
QList<QShaderKey> availableShaders() const
QShaderDescription description() const
bool isValid() const
QShader::NativeResourceBindingMap nativeResourceBindingMap(const QShaderKey &key) const
QShader::NativeShaderInfo nativeShaderInfo(const QShaderKey &key) const
void removeNativeShaderInfo(const QShaderKey &key)
void removeResourceBindingMap(const QShaderKey &key)
void removeSeparateToCombinedImageSamplerMappingList(const QShaderKey &key)
void removeShader(const QShaderKey &key)
QShader::SeparateToCombinedImageSamplerMappingList separateToCombinedImageSamplerMappingList(const QShaderKey &key) const
QByteArray serialized(QShader::SerializedFormatVersion version = SerializedFormatVersion::Latest) const
void setDescription(const QShaderDescription &desc)
void setNativeShaderInfo(const QShaderKey &key, const QShader::NativeShaderInfo &info)
void setResourceBindingMap(const QShaderKey &key, const QShader::NativeResourceBindingMap &map)
void setSeparateToCombinedImageSamplerMappingList(const QShaderKey &key, const QShader::SeparateToCombinedImageSamplerMappingList &list)
void setShader(const QShaderKey &key, const QShaderCode &shader)
void setStage(QShader::Stage stage)
QShaderCode shader(const QShaderKey &key) const
QShader::Stage stage() const
(since 6.7) void swap(QShader &other)
(since 6.7) QShader &operator=(QShader &&other)
QShader &operator=(const QShader &other)

Statische öffentliche Mitglieder

QShader fromSerialized(const QByteArray &data)
size_t qHash(const QShader &key, size_t seed = 0)
bool operator!=(const QShader &lhs, const QShader &rhs)
bool operator==(const QShader &lhs, const QShader &rhs)

Ausführliche Beschreibung

QShader ist der Einstiegspunkt für Shader-Code in der grafik-API-unabhängigen Qt-Welt. Anstelle der Verwendung von GLSL-Shader-Quelldateien, wie es bei Qt 5.x üblich war, nutzen neue Grafiksysteme mit Backends für mehrere Grafik-APIs – wie beispielsweise Vulkan, Metal, Direct3D und OpenGL – QShader als Eingabe, wann immer ein Shader festgelegt werden muss.

Warnung: Die Klassenfamilie „ QRhi “ im Qt GUI-Modul, einschließlich QShader und QShaderDescription, bietet nur eingeschränkte Kompatibilitätsgarantien. Für diese Klassen gibt es keine Garantie für Quellcode- oder Binärkompatibilität, was bedeutet, dass die API nur mit der Qt-Version garantiert funktioniert, auf deren Grundlage die Anwendung entwickelt wurde. Quellinkompatible Änderungen sollen jedoch auf ein Minimum beschränkt bleiben und werden nur in Minor-Releases (6.7, 6.8 usw.) vorgenommen. Um diese Klassen in einer Anwendung zu verwenden, verknüpfen Sie mit „ Qt::GuiPrivate “ (bei Verwendung von CMake) und binden Sie die Header mit dem Präfix „ rhi “ ein, zum Beispiel „ #include <rhi/qshader.h> “.

Eine QShader-Instanz ist standardmäßig leer und somit ungültig. Um eine brauchbare Instanz zu erhalten, gibt es zwei gängige Methoden:

  • Generieren Sie den Inhalt offline, während der Erstellungsphase oder noch früher, mithilfe des Befehlszeilentools „ qsb “. Das Ergebnis ist eine Binärdatei, die mit der Anwendung ausgeliefert wird, über „ QIODevice::readAll()“ eingelesen und anschließend über „ fromSerialized()“ deserialisiert wird. Weitere Informationen finden Sie unter QShaderBaker.
  • Generierung zur Laufzeit über ` QShaderBaker`. Dies ist ein rechenintensiver Vorgang, ermöglicht es Anwendungen jedoch, vom Benutzer bereitgestellte oder dynamisch generierte Shader-Quelltextzeichenfolgen zu verwenden.

Bei Verwendung zusammen mit der Qt-Rendering-Hardware-Schnittstelle und deren Klassen, wie z. B. ` QRhiGraphicsPipeline`, sind seitens der Anwendung keine weiteren Maßnahmen erforderlich, da diese Klassen darauf ausgelegt sind, einen `QShader` zu verarbeiten, sobald für eine bestimmte Stufe der Grafikpipeline ein Shader angegeben werden muss.

Alternativ können Anwendungen auf

  • auf den Quell- oder Bytecode für jede der im QShader enthaltenen Shading-Sprachversionen sowie
  • den Namen des Einstiegspunkts für den Shader,
  • die Reflection-Metadaten, die eine Beschreibung der Eingaben, Ausgaben und Ressourcen des Shaders wie z. B. Uniform-Blöcke enthalten. Dies ist unerlässlich, wenn eine Anwendung oder ein Framework die Eingaben eines Shaders zur Laufzeit ermitteln muss, da keine Vorabkenntnisse über die Vertex-Attribute oder das Layout der vom Shader verwendeten Uniform-Puffer vorliegen.

QShader trifft keine Annahmen hinsichtlich der Shading-Sprache, die als Quelle für die Generierung der verschiedenen darin enthaltenen Versionen und Varianten diente.

QShader nutzt implizites Sharing ähnlich wie viele Typen aus Qt Core und kann daher als Wert zurückgegeben oder übergeben werden. Die Entkopplung erfolgt implizit beim Aufruf eines Setters.

Als Referenz: Ein typischer, portabler „ QRhi “ erwartet, dass ein für alle seine Backends geeigneter QShader mindestens die folgenden Elemente enthält. (Dies schließt die Unterstützung für OpenGL-Kontexte des Core-Profils aus; füge hierfür GLSL 150 oder neuer hinzu.)

  • SPIR-V 1.0-Bytecode, der für Vulkan 1.0 oder neuer geeignet ist
  • GLSL/ES 100-Quellcode, der für OpenGL ES 2.0 oder neuer geeignet ist
  • GLSL 120-Quellcode, geeignet für OpenGL 2.1 oder neuer
  • HLSL-Shader-Model-5.0-Quellcode oder der entsprechende DXBC-Bytecode, geeignet für Direct3D 11/12
  • Metal Shading Language 1.2-Quellcode oder der entsprechende Bytecode, geeignet für Metal 1.2 oder neuer

Siehe auch QShaderBaker.

Dokumentation zu Mitgliedstypen

[alias] QShader::NativeResourceBindingMap

Synonym für QMap<int, std::pair<int, int>>.

Das von „ QRhi “ zugrunde gelegte Ressourcenbindungsmodell basiert auf SPIR-V. Das bedeutet, dass Uniform-Buffer, Speicher-Buffer, kombinierte Bild-Sampler und Speicherbilder einen gemeinsamen Bindungspunktbereich teilen. Es wird erwartet, dass die Bindungsnummern in QShaderDescription und QRhiShaderResourceBinding mit dem Layout-Qualifizierer „ binding “ im Vulkan-kompatiblen GLSL-Shader übereinstimmen.

Andere Grafik-APIs als Vulkan verwenden möglicherweise ein Ressourcenbindungsmodell, das damit nicht vollständig kompatibel ist. Der Generator des aus SPIR-V übersetzten Shader-Codes kann aus verschiedenen Gründen entscheiden, die SPIR-V-Bindungskennzeichen nicht zu berücksichtigen. Dies ist beispielsweise beim Metal-Backend von SPIRV-Cross der Fall. Darüber hinaus kann die Zuweisung von Ressourcenbindungen ohne die Einschränkungen durch die SPIR-V-Bindungspunkte zu besseren Ergebnissen führen, selbst wenn eine automatische, implizite Übersetzung größtenteils möglich ist (z. B. durch die Verwendung von SPIR-V-Bindungspunkten als HLSL-Ressourcenregisterindizes).

Daher kann ein „ QShader “ eine zusätzliche Zuordnung bereitstellen, die beschreibt, welcher native Bindungspunkt einer bestimmten SPIR-V-Bindung entspricht. Von den „ QRhi “-Backends, für die dies relevant ist, wird erwartet, dass sie diese Zuordnung gegebenenfalls automatisch verwenden. Der Wert ist ein Paar, da kombinierte Bild-Sampler in einigen Shading-Sprachen auf zwei native Ressourcen (eine Textur und einen Sampler) abgebildet werden können. In diesem Fall bezieht sich der zweite Wert auf den Sampler.

Hinweis: Die native Bindung kann den Wert -1 annehmen, falls im Shader keine aktive Bindung für die Ressource vorhanden ist. (Beispiel: Es ist ein Uniform-Block deklariert, der jedoch im Shader-Code nicht verwendet wird.) Die Zuordnung ist immer vollständig, d. h., es gibt einen Eintrag für alle deklarierten Uniform-Blöcke, Speicherblöcke, Bildobjekte und kombinierten Sampler; der Wert beträgt jedoch -1 für diejenigen, auf die in den Shader-Funktionen nicht tatsächlich verwiesen wird.

[alias] QShader::SeparateToCombinedImageSamplerMappingList

Synonym für „ QList “ <QShader::SeparateToCombinedImageSamplerMapping>.

enum class QShader::SerializedFormatVersion

Beschreibt das gewünschte Ausgabeformat bei der Serialisierung des „ QShader “.

Der Standardwert für das Argument „ version “ von „ serialized()“ lautet „ Latest “. Dies ist in den allermeisten Fällen ausreichend. Die Angabe eines anderen Werts ist nur erforderlich, wenn serialisierte Daten generiert werden sollen, die von früheren Qt-Versionen geladen werden können. Beispielsweise verwendet das Tool „ qsb “ diese Enum-Werte, wenn das Befehlszeilenargument „ --qsbversion “ angegeben wird.

Hinweis: Bei der Ausrichtung auf frühere Versionen funktionieren bestimmte Funktionen des generierten Assets nicht mehr. Dies stellt kein Problem dar, wenn das Asset mit der angegebenen, älteren Qt-Version verwendet wird, vorausgesetzt, diese Qt-Version verfügt nicht über die neueren Funktionen, die in neueren Qt-Versionen enthalten sind und auf zusätzlichen Daten basieren, die im „ QShader “ und im serialisierten Datenstrom generiert werden. Es kann jedoch zu Problemen kommen, wenn das generierte Asset anschließend mit einer neueren Qt-Version verwendet wird.

KonstanteWertBeschreibung
QShader::SerializedFormatVersion::Latest0Die aktuelle Qt-Version
QShader::SerializedFormatVersion::Qt_6_51Qt 6.5
QShader::SerializedFormatVersion::Qt_6_42Qt 6.4

enum QShader::Source

Beschreibt, welche Art von Shader-Code ein Eintrag enthält.

KonstanteWertBeschreibung
QShader::SpirvShader0SPIR-V
QShader::GlslShader1GLSL
QShader::HlslShader2HLSL
QShader::DxbcShader3Direct3D-Bytecode (HLSL, kompiliert mit fxc)
QShader::MslShader4Metal Shading Language
QShader::DxilShader5Direct3D-Bytecode (HLSL, kompiliert von dxc)
QShader::MetalLibShader6Vorkompilierter Metal-Bytecode
QShader::WgslShader7WGSL

enum QShader::Stage

Beschreibt die Stufe der Grafikpipeline, für die der Shader geeignet ist.

KonstanteWertBeschreibung
QShader::VertexStage0Vertex-Shader
QShader::TessellationControlStage1Tessellationssteuerungs- (Hull-)Shader
QShader::TessellationEvaluationStage2Tessellationsauswertungs-Shader (Domain)
QShader::GeometryStage3Geometrie-Shader
QShader::FragmentStage4Fragment- (Pixel-)Shader
QShader::ComputeStage5Compute-Shader

enum QShader::Variant

Beschreibt, welche Art von Shader-Code ein Eintrag enthält.

KonstanteWertBeschreibung
QShader::StandardShader0Die normale, unveränderte Version des Shader-Codes.
QShader::BatchableVertexShader1Vertex-Shader, der für das „ Qt Quick “-Scenegraph-Batching umgeschrieben wurde.
QShader::UInt16IndexedVertexAsComputeShader2Ein Vertex-Shader, der für den Einsatz in einer Metal-Pipeline mit Tessellation in Kombination mit indizierten Draw-Calls vorgesehen ist, bei denen die Indexdaten aus einem uint16-Indexpuffer bezogen werden. Zur Unterstützung der Metal-Tessellations-Pipeline wird der Vertex-Shader in einen Compute-Shader übersetzt, der von der Verwendung des Indexpuffers in den Draw-Calls abhängig sein kann (z. B. wenn der Shader gl_VertexIndex verwendet), weshalb drei spezielle Varianten erforderlich sind.
QShader::UInt32IndexedVertexAsComputeShader3Ein Vertex-Shader, der für den Einsatz in einer Metal-Pipeline mit Tessellation in Kombination mit indizierten Draw-Calls vorgesehen ist, wobei die Indexdaten aus einem uint32-Indexpuffer bezogen werden. Zur Unterstützung der Metal-Tessellationspipeline wird der Vertex-Shader in einen Compute-Shader übersetzt, der möglicherweise von der Verwendung des Indexpuffers in den Draw-Calls abhängt (z. B. wenn der Shader `gl_VertexIndex` verwendet), weshalb drei spezielle Varianten erforderlich sind.
QShader::NonIndexedVertexAsComputeShader4Ein Vertex-Shader, der für den Einsatz in einer Metal-Pipeline mit Tessellation in Kombination mit nicht indizierten Draw-Calls vorgesehen ist. Zur Unterstützung der Metal-Tessellations-Pipeline wird der Vertex-Shader in einen Compute-Shader übersetzt, der möglicherweise von der Verwendung des Indexpuffers in den Draw-Calls abhängt (z. B. wenn der Shader `gl_VertexIndex` verwendet), weshalb drei spezielle Varianten erforderlich sind.
QShader::HdrCapableFragmentShader (since Qt 6.10)5Ein Fragment-Shader, der umgeschrieben wurde, um High-Dynamic-Range-Rendering in einer „ Qt Quick “-Szenengrafik zu unterstützen.

Dokumentation der Member-Funktionen

QShader::QShader()

Erstellt eine neue, leere (und somit ungültige) QShader-Instanz.

QShader::QShader(const QShader &other)

Erstellt eine Kopie von „ other “.

[noexcept, since 6.7] QShader::QShader(QShader &&other)

Erstellt einen neuen QShader aus „ other “ mithilfe von „move“.

Hinweis: Das verschobene Objekt ` other ` befindet sich in einem teilweise initialisierten Zustand, in dem die einzigen zulässigen Operationen die Zerstörung und die Zuweisung eines neuen Werts sind.

Diese Funktion wurde in Qt 6.7 eingeführt.

[noexcept] QShader::~QShader()

Destruktor.

QList<QShaderKey> QShader::availableShaders() const

Gibt die Liste der verfügbaren Shader-Versionen zurück

QShaderDescription QShader::description() const

Gibt die Reflexionsmetadaten für den Shader zurück.

Siehe auch „ setDescription()“.

[static] QShader QShader::fromSerialized(const QByteArray &data)

Erstellt eine neue Instanz von ` QShader ` aus dem angegebenen ` data`.

Wenn „ data “ nicht erfolgreich deserialisiert werden kann, ist das Ergebnis ein standardmäßig initialisiertes „ QShader “, für das „ isValid()“ den Wert „ false “ zurückgibt.

Warnung: Shader-Pakete , einschließlich „ .qsb “-Dateien im Dateisystem, gelten als vertrauenswürdige Inhalte. Anwendungsentwicklern wird empfohlen, die möglichen Auswirkungen sorgfältig abzuwägen, bevor sie das Laden von benutzerbereitgestellten Inhalten zulassen, die nicht Teil der Anwendung sind.

Siehe auch serialized().

bool QShader::isValid() const

Gibt „true“ zurück, wenn die „ QShader “ mindestens eine Shader-Version enthält.

QShader::NativeResourceBindingMap QShader::nativeResourceBindingMap(const QShaderKey &key) const

Gibt die native Zuordnungstabelle für key zurück. Die Tabelle ist leer, wenn für key keine Zuordnung verfügbar ist (beispielsweise, weil die Tabelle nicht auf die unter key beschriebene API und Shading-Sprache anwendbar ist).

QShader::NativeShaderInfo QShader::nativeShaderInfo(const QShaderKey &key) const

Gibt die native Shader-Info-Struktur für „ key “ zurück oder ein leeres Objekt, wenn für „ key “ keine Daten verfügbar sind, beispielsweise weil eine solche Zuordnung für die Shading-Sprache oder die Shader-Stufe nicht anwendbar ist.

Siehe auch setNativeShaderInfo().

void QShader::removeNativeShaderInfo(const QShaderKey &key)

Entfernt die nativen Shader-Informationen für „ key “.

void QShader::removeResourceBindingMap(const QShaderKey &key)

Entfernt die native Ressourcen-Zuordnung für key.

void QShader::removeSeparateToCombinedImageSamplerMappingList(const QShaderKey &key)

Entfernt die Zuordnungsliste für den kombinierten Bild-Sampler für „ key “.

void QShader::removeShader(const QShaderKey &key)

Entfernt den Quell- oder Binär-Shader-Code für ein bestimmtes ` key`. Führt keine Aktion aus, wenn nichts gefunden wird.

QShader::SeparateToCombinedImageSamplerMappingList QShader::separateToCombinedImageSamplerMappingList(const QShaderKey &key) const

Gibt die kombinierte Bild-Sampler-Zuordnungsliste für „ key “ zurück oder eine leere Liste, wenn keine Daten für „ key “ verfügbar sind, beispielsweise weil eine solche Zuordnung für die Shading-Sprache nicht anwendbar ist.

Siehe auch ` setSeparateToCombinedImageSamplerMappingList()`.

QByteArray QShader::serialized(QShader::SerializedFormatVersion version = SerializedFormatVersion::Latest) const

Gibt eine serialisierte binäre Version aller vom ` QShader` verwalteten Daten zurück, die sich zum Schreiben in Dateien oder auf andere E/A-Geräte eignet.

Standardmäßig wird das neueste Serialisierungsformat verwendet. Verwenden Sie den Parameter „ version “, um die Serialisierung für eine bestimmte Qt-Version durchzuführen. Nur wenn bekannt ist, dass der generierte Datenstrom mit einer älteren Qt-Version kompatibel sein muss – auch wenn dies auf Kosten der Kompatibilität mit Funktionen geht, die seit dieser Qt-Version eingeführt wurden –, sollte ein anderer Wert (z. B. ` Qt_6_5 ` für Qt 6.5) verwendet werden.

Siehe auch ` fromSerialized()`.

void QShader::setDescription(const QShaderDescription &desc)

Setzt die Metadaten der Reflexion auf „ desc “.

Siehe auch description().

void QShader::setNativeShaderInfo(const QShaderKey &key, const QShader::NativeShaderInfo &info)

Speichert die angegebene native Shader- info, die mit key verknüpft ist.

Siehe auch ` nativeShaderInfo()`.

void QShader::setResourceBindingMap(const QShaderKey &key, const QShader::NativeResourceBindingMap &map)

Speichert die angegebene native Ressourcenbindung „ map “, die mit „ key “ verknüpft ist.

Siehe auch nativeResourceBindingMap().

void QShader::setSeparateToCombinedImageSamplerMappingList(const QShaderKey &key, const QShader::SeparateToCombinedImageSamplerMappingList &list)

Speichert die angegebene Zuordnung des kombinierten Bild-Samplers list, die mit key verknüpft ist.

Siehe auch separateToCombinedImageSamplerMappingList().

void QShader::setShader(const QShaderKey &key, const QShaderCode &shader)

Speichert den Quell- oder Binär shader -Code für eine bestimmte Shader-Version, die durch key angegeben wird.

Siehe auch ` shader()`.

void QShader::setStage(QShader::Stage stage)

Legt den Pipeline- stage fest.

Siehe auch stage().

QShaderCode QShader::shader(const QShaderKey &key) const

Gibt den Quell- oder Binärcode für eine bestimmte Shader-Version zurück, die durch ` key` angegeben wird.

Siehe auch setShader().

QShader::Stage QShader::stage() const

Gibt die Pipeline-Stufe zurück, für die der Shader vorgesehen ist.

Siehe auch „ setStage()“.

[noexcept, since 6.7] void QShader::swap(QShader &other)

Ersetzt diesen Shader durch „ other “. Dieser Vorgang ist sehr schnell und schlägt niemals fehl.

Diese Funktion wurde in Qt 6.7 eingeführt.

[noexcept, since 6.7] QShader &QShader::operator=(QShader &&other)

Weist „ other “ dieser Instanz von „ QShader “ zu.

Hinweis: Das verschobene Objekt other befindet sich in einem teilweise initialisierten Zustand, in dem die einzigen zulässigen Operationen die Zerstörung und die Zuweisung eines neuen Werts sind.

Diese Funktion wurde in Qt 6.7 eingeführt.

QShader &QShader::operator=(const QShader &other)

Weist diesem Objekt „ other “ zu.

Zugehörige Nicht-Mitglieder

[noexcept] size_t qHash(const QShader &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[noexcept] bool operator!=(const QShader &lhs, const QShader &rhs)

Gibt „ false “ zurück, wenn die Werte in den beiden „ QShader “-Objekten „ lhs “ und „ rhs “ identisch sind; andernfalls wird „ true “ zurückgegeben.

[noexcept] bool operator==(const QShader &lhs, const QShader &rhs)

Gibt „ true “ zurück, wenn die beiden „ QShader “-Objekte „ lhs “ und „ rhs “ gleich sind, d. h. wenn sie sich auf dieselbe Stage beziehen und übereinstimmende Sätze von Shader-Quell- oder Binärcode enthalten.

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