QRhiShaderResourceBindings Class
Verkapselt Ressourcen, um Puffer-, Textur- und Sampler-Ressourcen für Shader sichtbar zu machen. Mehr...
Kopfzeile: | #include <rhi/qrhi.h> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
qmake: | QT += gui-private |
Since: | Qt 6.6 |
Vererbt: | QRhiResource |
Öffentliche Typen
flags | UpdateFlags |
Öffentliche Funktionen
const QRhiShaderResourceBinding * | bindingAt(qsizetype index) const |
qsizetype | bindingCount() const |
const QRhiShaderResourceBinding * | cbeginBindings() const |
const QRhiShaderResourceBinding * | cendBindings() const |
bool | isLayoutCompatible(const QRhiShaderResourceBindings *other) const |
QVector<quint32> | serializedLayoutDescription() const |
void | setBindings(std::initializer_list<QRhiShaderResourceBinding> list) |
void | setBindings(InputIterator first, InputIterator last) |
Reimplementierte öffentliche Funktionen
virtual QRhiResource::Type | resourceType() const override |
Detaillierte Beschreibung
Ein QRhiShaderResourceBindings ist eine Sammlung von QRhiShaderResourceBinding Objekten, von denen jedes eine einzelne Bindung beschreibt.
Nehmen wir einen Fragment-Shader mit der folgenden Schnittstelle:
layout(std140, binding = 0) uniform buf { mat4 mvp; int flip; } ubuf; layout(binding = 1) uniform sampler2D tex;
Um Ressourcen für den Shader sichtbar zu machen, könnten die folgenden QRhiShaderResourceBindings erstellt und dann an QRhiGraphicsPipeline::setShaderResourceBindings() übergeben werden:
QRhiShaderResourceBindings *srb = rhi->newShaderResourceBindings(); srb->setBindings({ QRhiShaderResourceBinding::uniformBuffer(0, QRhiShaderResourceBinding::VertexStage | QRhiShaderResourceBinding::FragmentStage, ubuf), QRhiShaderResourceBinding::sampledTexture(1, QRhiShaderResourceBinding::FragmentStage, texture, sampler) }); srb->create(); // ... QRhiGraphicsPipeline *ps = rhi->newGraphicsPipeline(); // ... ps->setShaderResourceBindings(srb); ps->create(); // ... cb->setGraphicsPipeline(ps); cb->setShaderResources(); // binds srb
Dabei wird davon ausgegangen, dass ubuf
ein QRhiBuffer, texture
ein QRhiTexture und sampler ein QRhiSampler ist. Das Beispiel geht außerdem davon aus, dass der einheitliche Block auch im Vertex-Shader vorhanden ist, so dass der gleiche Puffer auch für die Vertex-Stufe sichtbar gemacht wird.
Erweiterte Verwendung
Aufbauend auf dem obigen Beispiel nehmen wir an, dass ein Durchlauf nun genau dieselbe Pipeline und Shader mit einer anderen Textur verwenden muss. Die Erstellung eines separaten QRhiGraphicsPipeline nur für diesen Fall wäre ein Overkill. Aus diesem Grund erlaubt QRhiCommandBuffer::setShaderResources() die Angabe eines srb Arguments. Solange die Layouts (also die Anzahl der Bindungen und die Bindungspunkte) zwischen zwei QRhiShaderResourceBindings übereinstimmen, können beide mit der gleichen Pipeline verwendet werden, vorausgesetzt, die Pipeline wurde mit einem von ihnen überhaupt erst erstellt. Siehe isLayoutCompatible() für weitere Details.
QRhiShaderResourceBindings *srb2 = rhi->newShaderResourceBindings(); // ... cb->setGraphicsPipeline(ps); cb->setShaderResources(srb2); // binds srb2
Hinweis: Dies ist eine RHI-API mit begrenzten Kompatibilitätsgarantien, siehe QRhi für weitere Einzelheiten.
Dokumentation der Mitgliedsfunktionen
const QRhiShaderResourceBinding *QRhiShaderResourceBindings::bindingAt(qsizetype index) const
Gibt die Bindung an die angegebene index zurück.
qsizetype QRhiShaderResourceBindings::bindingCount() const
Gibt die Anzahl der Bindungen zurück.
const QRhiShaderResourceBinding *QRhiShaderResourceBindings::cbeginBindings() const
Gibt einen konstanten Iterator zurück, der auf das erste Element in der Bindungsliste zeigt.
const QRhiShaderResourceBinding *QRhiShaderResourceBindings::cendBindings() const
Gibt einen konstanten Iterator zurück, der direkt auf das letzte Element in der Bindungsliste zeigt.
bool QRhiShaderResourceBindings::isLayoutCompatible(const QRhiShaderResourceBindings *other) const
Gibt true
zurück, wenn das Layout mit other kompatibel ist. Das Layout enthält nicht die eigentliche Ressource (z. B. Puffer oder Textur) und die zugehörigen Parameter (z. B. Offset oder Größe). Es enthält jedoch den Bindungspunkt, die Pipelinestufe und den Ressourcentyp. Die Anzahl und die Reihenfolge der Bindungen müssen ebenfalls übereinstimmen, um kompatibel zu sein.
Wenn eine QRhiGraphicsPipeline mit dieser QRhiShaderResourceBindings erstellt wurde und die Funktion true
zurückgibt, kann other sicher an QRhiCommandBuffer::setShaderResources() übergeben und so mit der Pipeline anstelle dieser QRhiShaderResourceBindings verwendet werden.
Hinweis: Diese Funktion darf nur nach einem erfolgreichen create() aufgerufen werden, da sie sich auf Daten stützt, die beim Backen der zugrunde liegenden Datenstrukturen erzeugt werden. Auf diese Weise kann die Funktion einen Vergleichsansatz implementieren, der effizienter ist als die Iteration durch zwei Bindungslisten und der Aufruf von QRhiShaderResourceBinding::isLayoutCompatible() für jedes Paar. Dies ist vor allem dann von Bedeutung, wenn diese Funktion sehr häufig aufgerufen wird.
Siehe auch serializedLayoutDescription().
[override virtual]
QRhiResource::Type QRhiShaderResourceBindings::resourceType() const
Reimplements: QRhiResource::resourceType() const.
Gibt den Ressourcentyp zurück.
QVector<quint32> QRhiShaderResourceBindings::serializedLayoutDescription() const
Gibt einen Vektor von Ganzzahlen zurück, der einen undurchsichtigen Blob enthält, der das Layout der Bindungsliste beschreibt, d. h. die für layout compatibility tests relevanten Daten.
Bei zwei Objekten srb1
und srb2
gilt: Sind die von dieser Funktion zurückgegebenen Daten identisch, so gilt auch srb1->isLayoutCompatible(srb2)
und umgekehrt.
Hinweis: Die zurückgegebenen Daten sind für die Speicherung im Speicher und für Vergleiche während der Lebensdauer des QRhi bestimmt, zu dem das Objekt gehört. Sie sind nicht für die Speicherung auf der Festplatte, die Wiederverwendung zwischen Prozessen oder die Verwendung mit mehreren QRhi Instanzen mit potenziell unterschiedlichen Backends gedacht.
Siehe auch isLayoutCompatible().
void QRhiShaderResourceBindings::setBindings(std::initializer_list<QRhiShaderResourceBinding> list)
Legt die list von Bindungen fest.
template <typename InputIterator> void QRhiShaderResourceBindings::setBindings(InputIterator first, InputIterator last)
Setzt die Liste der Bindungen aus den Iteratoren first und last.
© 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.