Sur cette page

QRhiShaderResourceBindings Class

Encapsule les ressources permettant de rendre les tampons, les textures et les échantillonneurs visibles par les nuanceurs. Plus d'informations...

En-tête : #include <rhi/qrhi.h>
CMake : find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate)
qmake : QT += gui-private
Depuis : Qt 6.6
Hérite : QRhiResource

Fonctions publiques

const QRhiShaderResourceBinding *bindingAt(qsizetype index) const
qsizetype bindingCount() const
const QRhiShaderResourceBinding *cbeginBindings() const
const QRhiShaderResourceBinding *cendBindings() const
virtual bool create() = 0
bool isLayoutCompatible(const QRhiShaderResourceBindings *other) const
QVector<quint32> serializedLayoutDescription() const
void setBindings(std::initializer_list<QRhiShaderResourceBinding> list)
void setBindings(InputIterator first, InputIterator last)

Fonctions publiques réimplémentées

virtual QRhiResource::Type resourceType() const override

Description détaillée

Un QRhiShaderResourceBindings est une collection d'objets QRhiShaderResourceBinding, chacun d'entre eux décrivant une seule liaison.

Prenons un fragment shader avec l'interface suivante :

layout(std140, binding = 0) uniform buf {
    mat4 mvp;
    int flip;
} ubuf;

layout(binding = 1) uniform sampler2D tex;

Pour rendre les ressources visibles au shader, les QRhiShaderResourceBindings suivants peuvent être créés et transmis à QRhiGraphicsPipeline::setShaderResourceBindings() :

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

Cela suppose que ubuf est un QRhiBuffer, texture est un QRhiTexture, tandis que sampler est un QRhiSampler. L'exemple suppose également que le bloc uniforme est également présent dans le vertex shader, de sorte que le même tampon est rendu visible à l'étape du vertex également.

Utilisation avancée

Sur la base de l'exemple ci-dessus, supposons qu'une passe doive maintenant utiliser exactement le même pipeline et les mêmes shaders avec une texture différente. La création d'un site QRhiGraphicsPipeline séparé juste pour cela serait exagérée. C'est pourquoi QRhiCommandBuffer::setShaderResources() permet de spécifier un argument srb. Tant que les layouts (donc le nombre de bindings et les points de binding) correspondent entre deux QRhiShaderResourceBindings, ils peuvent tous deux être utilisés avec le même pipeline, en supposant que le pipeline a été créé avec l'un d'entre eux en premier lieu. Voir isLayoutCompatible() pour plus de détails.

QRhiShaderResourceBindings *srb2 = rhi->newShaderResourceBindings();
// ...
cb->setGraphicsPipeline(ps);
cb->setShaderResources(srb2); // binds srb2

Remarque : il s'agit d'une API RHI avec des garanties de compatibilité limitées, voir QRhi pour plus de détails.

Documentation des fonctions membres

const QRhiShaderResourceBinding *QRhiShaderResourceBindings::bindingAt(qsizetype index) const

Renvoie la liaison à l'adresse index spécifiée.

qsizetype QRhiShaderResourceBindings::bindingCount() const

Renvoie le nombre de liaisons.

const QRhiShaderResourceBinding *QRhiShaderResourceBindings::cbeginBindings() const

Renvoie un itérateur constant pointant vers le premier élément de la liste de liaison.

const QRhiShaderResourceBinding *QRhiShaderResourceBindings::cendBindings() const

Renvoie un itérateur constant pointant juste après le dernier élément de la liste de liaison.

[pure virtual] bool QRhiShaderResourceBindings::create()

Crée l'ensemble de liaisons de ressources correspondant. En fonction de l'API graphique sous-jacente, cela peut impliquer la création de ressources graphiques natives, et il ne faut donc pas supposer qu'il s'agit d'une opération peu coûteuse.

Si create() a été appelé avant sans destroy() correspondant, alors destroy() est appelé implicitement en premier.

Retourne true en cas de succès, false en cas d'échec. Quelle que soit la valeur de retour, l'appel à destroy() est toujours sûr.

bool QRhiShaderResourceBindings::isLayoutCompatible(const QRhiShaderResourceBindings *other) const

Renvoie true si la disposition est compatible avec other. La disposition ne comprend pas la ressource réelle (telle que la mémoire tampon ou la texture) ni les paramètres connexes (tels que le décalage ou la taille). Elle inclut cependant le point de liaison, l'étape du pipeline et le type de ressource. Le nombre et l'ordre des liaisons doivent également correspondre pour être compatibles.

Lorsqu'un QRhiGraphicsPipeline a été créé avec ce QRhiShaderResourceBindings et que la fonction renvoie true, other peut alors être transmis en toute sécurité à QRhiCommandBuffer::setShaderResources() et être utilisé avec le pipeline à la place de QRhiShaderResourceBindings.

Remarque : cette fonction ne doit être appelée qu'après la réussite de create(), car elle s'appuie sur les données générées lors de la cuisson des structures de données sous-jacentes. De cette manière, la fonction peut mettre en œuvre une approche de comparaison qui est plus efficace que l'itération à travers deux listes de liaison et l'appel à QRhiShaderResourceBinding::isLayoutCompatible() pour chaque paire. Ceci est particulièrement important lorsque cette fonction est appelée à une fréquence élevée.

Voir également serializedLayoutDescription().

[override virtual] QRhiResource::Type QRhiShaderResourceBindings::resourceType() const

Réimplémente : QRhiResource::resourceType() const.

Renvoie le type de ressource.

QVector<quint32> QRhiShaderResourceBindings::serializedLayoutDescription() const

Renvoie un vecteur d'entiers contenant un blob opaque décrivant la disposition de la liste de liens, c'est-à-dire les données pertinentes pour layout compatibility tests.

Étant donné deux objets srb1 et srb2, si les données renvoyées par cette fonction sont identiques, alors srb1->isLayoutCompatible(srb2), et vice versa, le sont également.

Remarque : les données renvoyées sont destinées à être stockées en mémoire et à faire l'objet de comparaisons pendant la durée de vie du site QRhi auquel l'objet appartient. Elles ne sont pas destinées à être stockées sur disque, à être réutilisées entre processus ou à être utilisées avec plusieurs instances QRhi avec des backends potentiellement différents.

Voir aussi isLayoutCompatible().

void QRhiShaderResourceBindings::setBindings(std::initializer_list<QRhiShaderResourceBinding> list)

Définit l'adresse list des liaisons.

template <typename InputIterator> void QRhiShaderResourceBindings::setBindings(InputIterator first, InputIterator last)

Définit la liste des liaisons des itérateurs first et last.

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