QRhiShaderResourceBindings 类

封装资源以使缓冲区、纹理、采样器资源对着色器可见。 更多...

头文件 #include <QRhiShaderResourceBindings>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui
Qt 6.6
继承 QRhiResource

公共类型

公共功能

const QRhiShaderResourceBinding *bindingAt(qsizetype index) const
qsizetypebindingCount() const
const QRhiShaderResourceBinding *cbeginBindings() const
const QRhiShaderResourceBinding *cendBindings() const
boolisLayoutCompatible(const QRhiShaderResourceBindings *other) const
QVector<quint32>serializedLayoutDescription() const
voidsetBindings(std::initializer_list<QRhiShaderResourceBinding> list)
voidsetBindings(InputIterator first, InputIterator last)

重实现公共功能

virtual QRhiResource::TyperesourceType() const override

详细描述

QRhiShaderResourceBindings 是一组 QRhiShaderResourceBinding 对象的集合,每个对象描述一个单独的绑定。

以下是一个具有以下接口的片段着色器

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

layout(binding = 1) uniform sampler2D tex;

要使资源对着色器可见,可以创建以下 QRhiShaderResourceBindings,并将其传递给 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

此假设 ubufQRhiBuffertextureQRhiTexture,而 samplerQRhiSampler。此示例还假设均匀块存在于顶点着色器中,因此相同的缓冲区也使顶点阶段可见。

高级使用

基于以上示例,假设现在需要一个使用相同的管道和着色器但不同纹理的通行证。专门为这个创建一个单独的 QRhiGraphicsPipeline 将是过度之举。这就是为什么 QRhiCommandBuffer::setShaderResources() 允许指定 srb 参数的原因。只要两个 QRhiShaderResourceBindings 之间的布局(即绑定数量和绑定点)匹配,它们就可以一起使用同一管道,前提是管道最初是带着其中之一创建的。有关更多详细信息,请参阅 isLayoutCompatible()。

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

注意:这是一个具有有限兼容性保证的 RHI API,有关详细信息,请参阅 QRhi

成员函数文档

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

返回指定 index 的绑定。

qsizetype QRhiShaderResourceBindings::bindingCount() const

返回绑定数量。

const QRhiShaderResourceBinding *QRhiShaderResourceBindings::cbeginBindings() const

返回指向绑定列表中第一个项目的 const 迭代器。

const QRhiShaderResourceBinding *QRhiShaderResourceBindings::cendBindings() const

返回指向绑定列表中最后一个项目之后的位置的 const 迭代器。

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

如果布局与 other 兼容,则返回 true。该布局不包括实际资源(如缓冲区或纹理)和相关参数(如偏移量或大小)。但是,它包括绑定点、管道阶段和资源类型。为了兼容,绑定的数量和顺序也必须匹配。

当使用此 QRhiShaderResourceBindings 创建了 QRhiGraphicsPipeline,并且函数返回 true 时,则可以将 other 安全地传递给 QRhiCommandBuffer::setShaderResources(),然后可以与该管道一起使用,而不是此 QRhiShaderResourceBindings

注意:必须在与 successful create() 成功调用之后才能调用此函数,因为它依赖于底层数据结构烘焙期间生成数据的依赖性。这样,函数就可以实现一种比迭代两个绑定列表并对每一对调用 QRhiShaderResourceBinding::isLayoutCompatible() 更高效的比较方法。这在高频率调用此函数时尤其相关。

另请参阅:serializedLayoutDescription

[覆盖虚拟] QRhiResource::Type QRhiShaderResourceBindings::resourceType() const

重新实现: QRhiResource::resourceType() const

返回资源类型。

QVector<quint32> QRhiShaderResourceBindings::serializedLayoutDescription() const

返回一个包含描述绑定列表布局的不透明数据块的整数向量,即与布局兼容性测试相关的数据。

给定两个对象srb1srb2,如果此函数返回的数据相同,则srb1->isLayoutCompatible(srb2),反之亦然。

注意:返回的数据应用于存储在QRhi对象的整个生命周期中的内存和比较。它不适用于存储在磁盘上、在进程间重用或与具有不同后端的多QRhi实例一起使用。

另请参阅 isLayoutCompatible()。

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

设置绑定列表list

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

从迭代器firstlast设置绑定列表。

© 2024 The Qt Company Ltd. 嵌入此处的文档贡献是各自所有者的版权。提供的文档是根据Free Software Foundation发布的GNU自由文档许可1.3版的条款许可的。Qt和 respective logos是The Qt Company Ltd.在芬兰和其他国家/地区的商标。所有其他商标均为各自所有者的财产。