QRhiTextureRenderTargetDescription 类
描述了渲染目标的颜色和深度(或深度/模板)附件。 更多...
头文件 | #include <QRhiTextureRenderTargetDescription> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake | QT += gui |
自 | Qt 6.6 |
公共函数
QRhiTextureRenderTargetDescription() | |
QRhiTextureRenderTargetDescription(const QRhiColorAttachment &colorAttachment) | |
QRhiTextureRenderTargetDescription(const QRhiColorAttachment &colorAttachment, QRhiRenderBuffer *depthStencilBuffer) | |
QRhiTextureRenderTargetDescription(const QRhiColorAttachment &colorAttachment, QRhiTexture *depthTexture) | |
const QRhiColorAttachment * | cbeginColorAttachments() const |
const QRhiColorAttachment * | cendColorAttachments() const |
const QRhiColorAttachment * | colorAttachmentAt(qsizetype index) const |
qsizetype | colorAttachmentCount() const |
QRhiRenderBuffer * | depthStencilBuffer() const |
QRhiTexture * | depthTexture() const |
void | setColorAttachments(std::initializer_list<QRhiColorAttachment> list) |
void | setColorAttachments(InputIterator first, InputIterator last) |
void | setDepthStencilBuffer(QRhiRenderBuffer *renderBuffer) |
void | setDepthTexture(QRhiTexture *texture) |
详细描述
纹理渲染目标有零个或多个作为颜色附件的纹理,零个或一个作为深度/模板缓冲区的合成渲染缓冲区或零个或一个作为深度缓冲区的纹理。
注意:depthStencilBuffer() 和 depthTexture() 不能同时设置(不能同时非空)。
让我们看看如何与 QRhiTextureRenderTarget 结合的一些示例用法。
由于构造函数,仅针对纹理(没有深度/模板缓冲区)很简单
QRhiTexture *texture = rhi->newTexture(QRhiTexture::RGBA8, QSize(256, 256), 1, QRhiTexture::RenderTarget); texture->create(); QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget({ texture }));
以下创建了一个纹理渲染目标,将其设置为针对纹理的米柏等级 #2
QRhiTexture *texture = rhi->newTexture(QRhiTexture::RGBA8, QSize(512, 512), 1, QRhiTexture::RenderTarget | QRhiTexture::MipMapped); texture->create(); QRhiColorAttachment colorAtt(texture); colorAtt.setLevel(2); QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget({ colorAtt });
另一个示例,这次是渲染到深度纹理
QRhiTexture *shadowMap = rhi->newTexture(QRhiTexture::D32F, QSize(1024, 1024), 1, QRhiTexture::RenderTarget); shadowMap->create(); QRhiTextureRenderTargetDescription rtDesc; rtDesc.setDepthTexture(shadowMap); QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget(rtDesc);
一个非常常见的案例,使用纹理作为颜色附加对象,以及使用渲染缓冲区作为深度/模板来启用深度测试。
QRhiTexture *texture = rhi->newTexture(QRhiTexture::RGBA8, QSize(512, 512), 1. QRhiTexture::RenderTarget); texture->create(); QRhiRenderBuffer *depthStencil = rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, QSize(512, 512)); depthStencil->create(); QRhiTextureRenderTargetDescription rtDesc({ texture }, depthStencil); QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget(rtDesc);
最后,为了以可移植的方式启用多采样渲染(因此也支持OpenGL ES 3.0),使用一个QRhiRenderBuffer作为(多采样)颜色缓冲区,然后将其解算为常规(非多采样)的2D纹理。为了启用深度测试,还需要使用相同采样数的深度-模板缓冲区。
QRhiRenderBuffer *colorBuffer = rhi->newRenderBuffer(QRhiRenderBuffer::Color, QSize(512, 512), 4); // 4x MSAA colorBuffer->create(); QRhiRenderBuffer *depthStencil = rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, QSize(512, 512), 4); depthStencil->create(); QRhiTexture *texture = rhi->newTexture(QRhiTexture::RGBA8, QSize(512, 512), 1, QRhiTexture::RenderTarget); texture->create(); QRhiColorAttachment colorAtt(colorBuffer); colorAtt.setResolveTexture(texture); QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget({ colorAtt, depthStencil });
注意:这是一个RHI API,具有有限的兼容性保证,有关详细信息请参阅QRhi。
另请参阅:QRhiColorAttachment和QRhiTextureRenderTarget。
成员函数文档
[constexpr noexcept]
QRhiTextureRenderTargetDescription::QRhiTextureRenderTargetDescription()
构建一个空的纹理渲染目标描述。
QRhiTextureRenderTargetDescription::QRhiTextureRenderTargetDescription(const QRhiColorAttachment &colorAttachment)
使用colorAttachment描述的一个附件构建纹理渲染目标描述。
QRhiTextureRenderTargetDescription::QRhiTextureRenderTargetDescription(const QRhiColorAttachment &colorAttachment, QRhiRenderBuffer *depthStencilBuffer)
使用colorAttachment描述的一个颜色附件和depthStencilBuffer描述的一个深度/模板附件构建纹理渲染目标描述。
QRhiTextureRenderTargetDescription::QRhiTextureRenderTargetDescription(const QRhiColorAttachment &colorAttachment, QRhiTexture *depthTexture)
使用colorAttachment描述的一个颜色附件和depthTexture描述的一个深度附件构建纹理渲染目标描述。
注意:depthTexture必须有一个合适的格式,例如QRhiTexture::D16或QRhiTexture::D32F。
const QRhiColorAttachment *QRhiTextureRenderTargetDescription::cbeginColorAttachments() const
返回指向附件列表中第一个项目的const迭代器。
const QRhiColorAttachment *QRhiTextureRenderTargetDescription::cendColorAttachments() const
返回指向附件列表最后一个项目之后的const迭代器。
const QRhiColorAttachment *QRhiTextureRenderTargetDescription::colorAttachmentAt(qsizetype index) const
返回指定index的颜色附件。
qsizetype QRhiTextureRenderTargetDescription::colorAttachmentCount() const
返回当前设置的附件数量。
QRhiRenderBuffer *QRhiTextureRenderTargetDescription::depthStencilBuffer() const
返回用作深度-模板缓冲区的渲染缓冲区,如果没有设置,则返回nullptr
。
另请参阅:setDepthStencilBuffer。
QRhiTexture *QRhiTextureRenderTargetDescription::depthTexture() const
返回当前引用的深度纹理,如果没有设置,则返回 nullptr
。
另请参阅 setDepthTexture。
void QRhiTextureRenderTargetDescription::setColorAttachments(std::initializer_list<QRhiColorAttachment> list)
设置颜色附件的 list。
template <typename InputIterator> void QRhiTextureRenderTargetDescription::setColorAttachments(InputIterator first, InputIterator last)
通过迭代器 first 和 last 设置颜色附件的列表。
void QRhiTextureRenderTargetDescription::setDepthStencilBuffer(QRhiRenderBuffer *renderBuffer)
设置深度-模板缓冲区 renderBuffer。不是必需的,例如,当在渲染通道的任何图形管道中不使用深度测试/写入或模板相关功能时,它可以设置为 nullptr
。
注意:depthStencilBuffer() 和 depthTexture() 不能同时设置(不能同时非空)。
使用2D QRhiTexture 作为深度或深度/模板缓冲区非常常见,也是应用的建议方法。使用 QRhiTexture,因此 setDepthTexture() 变得相关,如果是之后访问深度数据(例如在着色器中采样),或者当涉及 多视渲染(因为深度纹理必须是纹理数组)。
另请参阅 depthStencilBuffer() 和 setDepthTexture。
void QRhiTextureRenderTargetDescription::setDepthTexture(QRhiTexture *texture)
设置深度-模板缓冲区的 texture。这是 setDepthStencilBuffer 的替代方案,其中提供的是 QRhiTexture 而不是 QRhiRenderBuffer,其类型适合(例如,QRhiTexture::D32F)。
注意:depthStencilBuffer() 和 depthTexture() 不能同时设置(不能同时非空)。
texture 可以是一个2D纹理,也可以是一个2D纹理数组(当支持纹理数组时)。尤其是与 多视渲染 相关时,指定纹理数组是相关的。
注意:如果 texture 是具有模板组件的格式,例如 QRhiTexture::D24S8,它还作为模板缓冲区。
另请参阅 depthTexture() 和 setDepthStencilBuffer。
© 2024 The Qt Company Ltd. 本文档的贡献是各自所有者的版权。本文档是根据由自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款许可的。Qt及其标志是芬兰和/或其他国家/地区的The Qt Company Ltd的商标。所有其他商标均为各自所有者的财产。