QShader Class

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

Kopfzeile: #include <QShader>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Since: 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 }

Ö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)

Detaillierte Beschreibung

QShader ist der Einstiegspunkt zu Shader-Code in der Grafik-API-agnostischen Qt-Welt. Anstatt GLSL-Shader-Quellen zu verwenden, wie es mit Qt 5.x üblich war, nehmen neue Grafiksysteme mit Backends für mehrere Grafik-APIs, wie Vulkan, Metal, Direct3D und OpenGL, QShader als Eingabe, wenn ein Shader spezifiziert werden muss.

Warnung: Die QRhi Familie von Klassen im Qt Gui Modul, einschließlich QShader und QShaderDescription, bieten begrenzte Kompatibilitätsgarantien. Es gibt keine Quell- oder Binärkompatibilitätsgarantien für diese Klassen, was bedeutet, dass die API nur mit der Qt-Version funktioniert, mit der die Anwendung entwickelt wurde. Quellcode-inkompatible Änderungen sollen jedoch auf ein Minimum beschränkt werden und werden nur in kleineren Versionen (6.7, 6.8 usw.) vorgenommen. Um diese Klassen in einer Anwendung zu verwenden, verlinken Sie auf Qt::GuiPrivate (wenn Sie CMake verwenden) und fügen Sie die Header mit dem Präfix rhi ein, zum Beispiel #include <rhi/qshader.h>.

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

  • Erzeugen Sie den Inhalt offline, während der Build-Zeit oder früher, mit dem qsb Kommandozeilen-Tool. Das Ergebnis ist eine Binärdatei, die mit der Anwendung ausgeliefert, über QIODevice::readAll() gelesen und dann über fromSerialized() deserialisiert wird. Weitere Informationen finden Sie unter QShaderBaker.
  • Generieren Sie zur Laufzeit über QShaderBaker. Dies ist ein kostspieliger Vorgang, ermöglicht es aber Anwendungen, vom Benutzer bereitgestellte oder dynamisch generierte Shader-Quellstrings zu verwenden.

Wenn es zusammen mit dem Qt Rendering Hardware Interface und seinen Klassen, wie QRhiGraphicsPipeline, verwendet wird, ist keine weitere Aktion von Seiten der Anwendung notwendig, da diese Klassen darauf vorbereitet sind, einen QShader zu konsumieren, wann immer ein Shader für eine bestimmte Stufe der Grafikpipeline angegeben werden muss.

Alternativ dazu können Anwendungen auf

  • den Quell- oder Bytecode für eine der Shading-Sprachversionen, die im QShader enthalten sind,
  • den Namen des Einstiegspunkts für den Shader,
  • die Reflexions-Metadaten, die eine Beschreibung der Eingänge, Ausgänge und Ressourcen des Shaders wie einheitliche Blöcke enthalten. Dies ist von wesentlicher Bedeutung, wenn eine Anwendung oder ein Framework die Eingänge eines Shaders zur Laufzeit ermitteln muss, weil die Vertex-Attribute oder das Layout der vom Shader verwendeten einheitlichen Puffer nicht bekannt sind.

QShader macht keine Annahmen über die Shading-Sprache, die als Quelle für die Generierung der verschiedenen Versionen und Varianten, die in ihm enthalten sind, verwendet wurde.

QShader verwendet implizites Sharing ähnlich wie viele Qt-Kerntypen und kann daher als Wert zurückgegeben oder übergeben werden. Detach geschieht implizit beim Aufruf eines Setters.

Als Referenz erwartet ein typisches, portables QRhi, dass ein QShader, der für alle seine Backends geeignet ist, mindestens das Folgende enthält. (dies schließt die Unterstützung für Kernprofil-OpenGL-Kontexte aus, fügen Sie dafür GLSL 150 oder neuer hinzu)

  • SPIR-V 1.0 Bytecode geeignet für Vulkan 1.0 oder neuer
  • GLSL/ES 100 Quellcode geeignet für OpenGL ES 2.0 oder neuer
  • 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.

Member Type Dokumentation

[alias] QShader::NativeResourceBindingMap

Synonym für QMap<int, QPair<int, int>>.

Das Ressourcenbindungsmodell QRhi basiert auf SPIR-V. Das bedeutet, dass einheitliche Puffer, Speicherpuffer, kombinierte Bildsampler und Speicherbilder einen gemeinsamen Bindungspunktraum nutzen. Es wird erwartet, dass die Bindungsnummern in QShaderDescription und QRhiShaderResourceBinding mit dem Layout-Qualifier binding im Vulkan-kompatiblen GLSL-Shader übereinstimmen.

Andere Grafik-APIs als Vulkan verwenden möglicherweise ein Ressourcenbindungsmodell, das nicht vollständig mit diesem kompatibel ist. Der Generator des aus SPIR-V übersetzten Shader-Codes kann sich aus verschiedenen Gründen dafür entscheiden, die SPIR-V-Bindungsqualifikatoren nicht zu berücksichtigen. Dies ist z. B. beim Metal-Backend von SPIRV-Cross der Fall. Auch wenn eine automatische, implizite Übersetzung meist möglich ist (z. B. durch Verwendung von SPIR-V-Bindungspunkten als HLSL-Ressourcenregister-Indizes), kann die Zuweisung von Ressourcenbindungen ohne Beschränkung durch die SPIR-V-Bindungspunkte zu besseren Ergebnissen führen.

Aus diesem Grund kann QShader eine zusätzliche Map bereitstellen, die beschreibt, was der native Bindungspunkt für eine bestimmte SPIR-V-Bindung ist. Von den QRhi Backends, für die dies relevant ist, wird erwartet, dass sie diese Karte gegebenenfalls automatisch verwenden. Der Wert ist ein Paar, da kombinierte Bild-Sampler in einigen Schattierungssprachen 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 -1 sein, falls es keine aktive Bindung für die Ressource im Shader gibt. (Die Map ist immer vollständig, d. h. es gibt einen Eintrag für alle deklarierten Uniform-Blöcke, Speicherblöcke, Bildobjekte und kombinierten Sampler, aber der Wert ist -1 für diejenigen, die nicht tatsächlich in den Shader-Funktionen referenziert werden.

[alias] QShader::SeparateToCombinedImageSamplerMappingList

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

enum class QShader::SerializedFormatVersion

Beschreibt das gewünschte Ausgabeformat bei der Serialisierung der QShader.

Der Standardwert für das Argument version von serialized() ist Latest. Dies ist in den allermeisten Fällen ausreichend. Die Angabe eines anderen Wertes ist nur dann erforderlich, wenn die Absicht besteht, serialisierte Daten zu erzeugen, die von früheren Qt-Versionen geladen werden können. Zum Beispiel verwendet das Werkzeug qsb diese Enum-Werte, wenn das Kommandozeilen-Argument --qsbversion angegeben wird.

Hinweis: Die Ausrichtung auf frühere Versionen führt dazu, dass bestimmte Funktionen mit dem generierten Asset nicht mehr funktionieren. Dies ist kein Problem, wenn das Asset mit der angegebenen, älteren Qt-Version verwendet wird, da diese Qt-Version nicht über die neueren Funktionen in neueren Qt-Versionen verfügt, die sich auf zusätzliche Daten stützen, die im QShader und im serialisierten Datenstrom erzeugt werden, kann aber zu einem Problem werden, wenn das generierte Asset dann 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 von 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::TessellationControlStage1Tessellierungssteuerung (Hüllenshader) Shader
QShader::TessellationEvaluationStage2Tesselierungsauswertung (Domäne) Shader
QShader::GeometryStage3Geometrie-Shader
QShader::FragmentStage4Fragment-Shader (Pixel-Shader)
QShader::ComputeStage5Berechnungs-Shader

enum QShader::Variant

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

KonstanteWertBeschreibung
QShader::StandardShader0Die normale, unmodifizierte Version des Shader-Codes.
QShader::BatchableVertexShader1Vertex-Shader, der umgeschrieben wurde, um für Qt Quick scenegraph batching geeignet zu sein.
QShader::UInt16IndexedVertexAsComputeShader2Ein Vertex-Shader, der für die Verwendung in einer Metal-Pipeline mit Tesselation in Kombination mit indizierten Zeichenaufrufen gedacht ist, die Indexdaten aus einem uint16-Indexpuffer beziehen. Zur Unterstützung der Metal-Tessellation-Pipeline wird der Vertex-Shader in einen Compute-Shader übersetzt, der von der Verwendung des Indexpuffers in den Draw-Aufrufen abhängig sein kann (z. B. wenn der Shader gl_VertexIndex verwendet), daher sind drei spezielle Varianten erforderlich.
QShader::UInt32IndexedVertexAsComputeShader3Ein Vertex-Shader, der in einer Metal-Pipeline mit Tessellation in Kombination mit indizierten Zeichenaufrufen verwendet werden soll, die Indexdaten aus einem uint32-Indexpuffer beziehen. Zur Unterstützung der Metal-Tessellation-Pipeline wird der Vertex-Shader in einen Compute-Shader übersetzt, der von der Verwendung des Indexpuffers in den Draw-Aufrufen abhängig sein kann (z. B. wenn der Shader gl_VertexIndex verwendet), daher sind drei spezielle Varianten erforderlich.
QShader::NonIndexedVertexAsComputeShader4Ein Vertex-Shader, der in einer Metal-Pipeline mit Tessellation in Kombination mit nicht-indizierten Zeichenaufrufen verwendet werden soll. Zur Unterstützung der Metal-Tessellation-Pipeline wird der Vertex-Shader in einen Compute-Shader übersetzt, der von der Verwendung des Indexpuffers in den Draw-Aufrufen abhängig sein kann (z. B. wenn der Shader gl_VertexIndex verwendet), weshalb drei spezielle Varianten erforderlich sind.

Dokumentation der Mitgliedsfunktionen

QShader::QShader()

Konstruiert eine neue, leere (und damit ungültige) QShader-Instanz.

QShader::QShader(const QShader &other)

Konstruiert eine Kopie von other.

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

Move-konstruiert einen neuen QShader aus other.

Hinweis: Das verschobene Objekt other wird in einen teilweise gebildeten Zustand versetzt, in dem die einzigen gültigen Operationen Zerstörung und Zuweisung eines neuen Wertes sind.

Diese Funktion wurde in Qt 6.7 eingeführt.

[noexcept] QShader::~QShader()

Zerstörer.

QList<QShaderKey> QShader::availableShaders() const

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

QShaderDescription QShader::description() const

Gibt die Reflexions-Metadaten für den Shader zurück.

Siehe auch setDescription().

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

Erzeugt eine neue QShader Instanz aus der angegebenen data.

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

Siehe auch serialized().

bool QShader::isValid() const

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

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

Gibt die native Bindungszuordnung für key zurück. Die Zuordnung ist leer, wenn für key keine Zuordnung verfügbar ist (z. B. weil die Zuordnung nicht für die von key beschriebene API und Schattierungssprache gilt).

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

Gibt die native Shader-Info-Struktur für key zurück, oder ein leeres Objekt, wenn keine Daten für key verfügbar sind, z. B. weil ein solches Mapping 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 Resource Binding Map für key.

void QShader::removeSeparateToCombinedImageSamplerMappingList(const QShaderKey &key)

Entfernt die kombinierte Bildsampler-Zuordnungsliste für key.

void QShader::removeShader(const QShaderKey &key)

Entfernt den Quell- oder Binär-Shader-Code für einen bestimmten key. Tut nichts, wenn er nicht gefunden wird.

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

Liefert die kombinierte Image-Sampler-Zuordnungsliste für key, oder eine leere Liste, wenn keine Daten für key verfügbar sind, z. B. weil eine solche Zuordnung für die Schattierungssprache nicht anwendbar ist.

Siehe auch setSeparateToCombinedImageSamplerMappingList().

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

Gibt eine serialisierte Binärversion aller in QShader enthaltenen Daten zurück, die sich zum Schreiben in Dateien oder andere E/A-Geräte eignet.

Standardmäßig wird das neueste Serialisierungsformat verwendet. Verwenden Sie den Parameter version zur Serialisierung für eine kompatible Qt-Version. Nur wenn bekannt ist, dass der erzeugte Datenstrom mit einer älteren Qt-Version kompatibel gemacht werden muss, und zwar auf Kosten der Inkompatibilität mit Funktionen, die seit dieser Qt-Version eingeführt wurden, sollte ein anderer Wert (zum Beispiel Qt_6_5 für Qt 6.5) verwendet werden.

Siehe auch fromSerialized().

void QShader::setDescription(const QShaderDescription &desc)

Setzt die Reflection-Metadaten auf desc.

Siehe auch description().

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

Speichert den angegebenen nativen Shader info, der mit key verbunden ist.

Siehe auch nativeShaderInfo().

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

Speichert die angegebene native Ressourcenbindung map in Verbindung mit key.

Siehe auch nativeResourceBindingMap().

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

Speichert die angegebene kombinierte Bild-Sampler-Zuordnung list, die mit key verbunden ist.

Siehe auch separateToCombinedImageSamplerMappingList().

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

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

Siehe auch shader().

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

Legt die 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 Pipelinestufe zurück, für die der Shader bestimmt ist.

Siehe auch setStage().

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

Tauscht diesen Shader mit other aus. Dieser Vorgang ist sehr schnell und schlägt nie fehl.

Diese Funktion wurde in Qt 6.7 eingeführt.

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

Verschieben - weist other dieser QShader Instanz zu.

Hinweis: Das verschobene Objekt other wird in einen teilweise gebildeten Zustand versetzt, in dem die einzigen gültigen Operationen Zerstörung und Zuweisung eines neuen Wertes sind.

Diese Funktion wurde in Qt 6.7 eingeführt.

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

Weist diesem Objekt other zu.

Verwandte 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 Objekten QShader lhs und rhs gleich sind; andernfalls wird true zurückgegeben.

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

Gibt true zurück, wenn die beiden Objekte QShader lhs und rhs gleich sind, d. h., sie sind für dieselbe Stufe mit übereinstimmenden Sätzen von Shader-Quell- oder Binärcode.

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