QRhiShaderResourceBindings 类
封装资源以使缓冲区、纹理、采样器资源对着色器可见。 更多...
头文件 | #include <QRhiShaderResourceBindings> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake | QT += gui |
自 | Qt 6.6 |
继承 | QRhiResource |
公共类型
flags | UpdateFlags |
公共功能
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) |
重实现公共功能
virtual QRhiResource::Type | resourceType() 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
此假设 ubuf
是 QRhiBuffer,texture
是 QRhiTexture,而 sampler 是 QRhiSampler。此示例还假设均匀块存在于顶点着色器中,因此相同的缓冲区也使顶点阶段可见。
高级使用
基于以上示例,假设现在需要一个使用相同的管道和着色器但不同纹理的通行证。专门为这个创建一个单独的 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
返回一个包含描述绑定列表布局的不透明数据块的整数向量,即与布局兼容性测试相关的数据。
给定两个对象srb1
和srb2
,如果此函数返回的数据相同,则srb1->isLayoutCompatible(srb2)
,反之亦然。
另请参阅 isLayoutCompatible()。
void QRhiShaderResourceBindings::setBindings(std::initializer_list<QRhiShaderResourceBinding> list)
设置绑定列表list。
template <typename InputIterator> void QRhiShaderResourceBindings::setBindings(InputIterator first, InputIterator last)
从迭代器first和last设置绑定列表。
© 2024 The Qt Company Ltd. 嵌入此处的文档贡献是各自所有者的版权。提供的文档是根据Free Software Foundation发布的GNU自由文档许可1.3版的条款许可的。Qt和 respective logos是The Qt Company Ltd.在芬兰和其他国家/地区的商标。所有其他商标均为各自所有者的财产。