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.