QRhiTexture Class
纹理资源。更多
头文件: | #include <rhi/qrhi.h> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
qmake: | QT += gui-private |
自 | Qt 6.6 |
继承: | QRhiResource |
公共类型
struct | NativeTexture |
(since 6.8) struct | ViewFormat |
enum | Flag { RenderTarget, CubeMap, MipMapped, sRGB, UsedAsTransferSource, …, UsedAsShadingRateMap } |
flags | Flags |
enum | Format { UnknownFormat, RGBA8, BGRA8, R8, RG8, …, RGBA32UI } |
公共函数
int | arrayRangeLength() const |
int | arrayRangeStart() const |
int | arraySize() const |
virtual bool | create() = 0 |
virtual bool | createFrom(QRhiTexture::NativeTexture src) |
int | depth() const |
QRhiTexture::Flags | flags() const |
QRhiTexture::Format | format() const |
virtual QRhiTexture::NativeTexture | nativeTexture() |
QSize | pixelSize() const |
(since 6.8) QRhiTexture::ViewFormat | readViewFormat() const |
int | sampleCount() const |
void | setArrayRange(int startIndex, int count) |
void | setArraySize(int arraySize) |
void | setDepth(int depth) |
void | setFlags(QRhiTexture::Flags f) |
void | setFormat(QRhiTexture::Format fmt) |
virtual void | setNativeLayout(int layout) |
void | setPixelSize(const QSize &sz) |
(since 6.8) void | setReadViewFormat(const QRhiTexture::ViewFormat &fmt) |
void | setSampleCount(int s) |
(since 6.8) void | setWriteViewFormat(const QRhiTexture::ViewFormat &fmt) |
(since 6.8) QRhiTexture::ViewFormat | writeViewFormat() const |
重新实现的公共函数
virtual QRhiResource::Type | resourceType() const override |
详细说明
QRhiTexture 封装了一个本地纹理对象,如VkImage
或MTLTexture
。
QRhiTexture 实例总是通过调用the QRhi's newTexture() function 来创建的。这不会创建任何本地图形资源。为此,请在设置适当的选项(如格式和大小)后调用create() ,不过在大多数情况下,这些选项已经根据传递给newTexture() 的参数设置好了。
正确设置flags 至关重要,否则会出现各种错误,这取决于底层的QRhi 后端和图形 API。例如,当通过QRhiTextureRenderTarget 渲染纹理时,创建纹理时必须设置RenderTarget 标志。同样,当纹理将被read back 时,必须预先设置UsedAsTransferSource 标志。Mipmapped 纹理必须设置MipMapped 标志。以此类推。一旦create() 成功,就无法更改标记。要释放现有的纹理并使用更改后的设置创建新的本地纹理对象,需要调用设置器并再次调用create() 。这样的操作可能会很昂贵。
使用示例
创建大小为 512x512 像素的 2D 纹理,并将其内容设置为全绿色:
QRhiTexture *texture = rhi->newTexture(QRhiTexture::RGBA8, QSize(512, 512)); if (!texture->create()) { error(); } QRhiResourceUpdateBatch *batch = rhi->nextResourceUpdateBatch(); QImage image(512, 512, QImage::Format_RGBA8888); image.fill(Qt::green); batch->uploadTexture(texture, image); // ... commandBuffer->resourceUpdate(batch); // or, alternatively, pass 'batch' to a beginPass() call
常见模式
如果之前成功调用了create() ,则调用create() 会销毁任何现有的本地资源。如果飞行中的帧仍在使用这些本地资源(即 GPU 仍有可能读取这些资源),则会自动推迟销毁这些资源。因此,要安全地更改已存在纹理的大小,一种非常常见和方便的模式如下。在实践中,这种方法会在下方丢弃并创建一个全新的本地纹理资源,因此并不一定是一种廉价的操作,但却比其他方法更方便、更快捷,因为通过不销毁texture
对象本身,在其他数据结构中(例如在 QRhiTexture 引用的任何 QShaderResourceBinding 中)对该对象的所有引用都将保持有效。
// determine newSize, e.g. based on the swapchain's output size or other factors if (texture->pixelSize() != newSize) { texture->setPixelSize(newSize); if (!texture->create()) { error(); } } // continue using texture, fill it with new data
注: 这是一个 RHI API,兼容性保证有限,详情请参见QRhi 。
另请参阅 QRhiResourceUpdateBatch,QRhi, 和QRhiTextureRenderTarget 。
成员类型文档
枚举 QRhiTexture::Flag
flags QRhiTexture::Flags
用于指定如何使用纹理的标志值。如果不遵守在create() 之前设置的 Flags 值,并试图以事先未声明的方式使用纹理,则可能导致未指定的行为或性能下降,具体取决于后端和底层图形 API。
常量 | 值 | 说明 |
---|---|---|
QRhiTexture::RenderTarget | 1 << 0 | 与QRhiTextureRenderTarget 结合使用的纹理。 |
QRhiTexture::CubeMap | 1 << 2 | 该纹理是立方体贴图。这种纹理有 6 个图层,按照 +X、-X、+Y、-Y、+Z、-Z 的顺序,每个面一个图层。立方体贴图纹理不能多采样。 |
QRhiTexture::MipMapped | 1 << 3 | 纹理具有 mipmaps。相应的 mip 数量会自动计算,也可以通过QRhi::mipLevelsForSize() 获取。必须在上传的纹理中提供 mip 层的图像,或通过QRhiResourceUpdateBatch::generateMips() 生成。多采样纹理不能使用 mipmaps。 |
QRhiTexture::sRGB | 1 << 4 | 请使用 sRGB 格式。 |
QRhiTexture::UsedAsTransferSource | 1 << 5 | 纹理被用作纹理复制或回读的源,这意味着纹理在QRhiResourceUpdateBatch::copyTexture() 或QRhiResourceUpdateBatch::readBackTexture() 中被用作源。 |
QRhiTexture::UsedWithGenerateMips | 1 << 6 | 该纹理将与QRhiResourceUpdateBatch::generateMips() 一起使用。 |
QRhiTexture::UsedWithLoadStore | 1 << 7 | 纹理将用于图像加载/存储操作,例如在计算着色器中。 |
QRhiTexture::UsedAsCompressedAtlas | 1 << 8 | 纹理采用压缩格式,上传子资源的尺寸可能与纹理尺寸不匹配。 |
QRhiTexture::ExternalOES | 1 << 9 | 纹理应使用 OpenGL 的 GL_TEXTURE_EXTERNAL_OES 目标。其他图形 API 会忽略此标记。 |
QRhiTexture::ThreeDimensional | 1 << 10 | 纹理是 3D 纹理。创建此类纹理时,应使用QRhi::newTexture() 重载,除了宽度和高度外,还应使用深度。三维纹理可以有贴图,但不能多采样。在向三维纹理渲染或上传数据时,渲染目标的颜色附件或上传描述中指定的layer 指的是范围 [0..depth-1] 的单个切片。底层图形 API 在运行时可能不支持三维纹理。QRhi::ThreeDimensionalTextures 。 |
QRhiTexture::TextureRectangleGL | 1 << 11 | 纹理应使用 OpenGL 的 GL_TEXTURE_RECTANGLE 目标。其他图形 API 会忽略此标记。与 ExternalOES 一样,在使用平台 API 时,如果从平台接收的本地 OpenGL 纹理对象被包裹在QRhiTexture 中,而平台只能为非 2D 纹理目标提供纹理,则此标记非常有用。 |
QRhiTexture::TextureArray | 1 << 12 | 纹理是一个纹理数组,即由 2D 纹理组成的同质数组。纹理数组通过QRhi::newTextureArray() 创建。底层图形应用程序接口在运行时可能不支持纹理数组对象。QRhi::TextureArrays 。在向纹理数组渲染或上传数据时,渲染目标的颜色附件或上传说明中指定的layer 会选择数组中的单个元素。 |
QRhiTexture::OneDimensional | 1 << 13 | 纹理是一维纹理。这种纹理可以通过向QRhi::newTexture() 传递 0 的高度和深度来创建。请注意,一维纹理可能会受到底层图形 API 的限制。例如,可能不支持渲染一维纹理或使用基于 mipmap 的过滤功能。这可以通过QRhi::OneDimensionalTextures 和QRhi::OneDimensionalTextureMipmaps 功能标志来表示。 |
QRhiTexture::UsedAsShadingRateMap | 1 << 14 |
Flags 类型是QFlags<Flag> 的类型定义。它存储 Flag 值的 OR 组合。
enum QRhiTexture::Format
指定纹理格式。另请参阅QRhi::isTextureFormatSupported() 并注意flags() 可以在设置QRhiTexture::sRGB 时修改格式。
常量 | 值 | 说明 |
---|---|---|
QRhiTexture::UnknownFormat | 0 | 非有效格式。不能传递给setFormat() 。 |
QRhiTexture::RGBA8 | 1 | 四个分量,每个分量无符号规范化为 8 位。始终支持。(共 32 位) |
QRhiTexture::BGRA8 | 2 | 四个分量,每个分量无符号标准化为 8 位。(共 32 位) |
QRhiTexture::R8 | 3 | 一个元件,无符号标准化 8 位。(共 8 位) |
QRhiTexture::RG8 | 4 | 两个分量,无符号标准化 8 位。(共 16 位) |
QRhiTexture::R16 | 5 | 一个元件,无符号规范化 16 位。(共 16 位) |
QRhiTexture::RG16 | 6 | 两个分量,无符号规范化 16 位。(共 32 位) |
QRhiTexture::RED_OR_ALPHA8 | 7 | 或与 R8 相同,或为类似格式,将分量旋转为 alpha,具体取决于RedOrAlpha8IsRed 。(共 8 位) |
QRhiTexture::RGBA16F | 8 | 四个分量,16 位浮点运算。(共 64 位) |
QRhiTexture::RGBA32F | 9 | 四个分量,32 位浮点运算。(共 128 位) |
QRhiTexture::R16F | 10 | 一个分量,16 位浮点运算。(共 16 位) |
QRhiTexture::R32F | 11 | 一个元件,32 位浮点运算。(共 32 位) |
QRhiTexture::RGB10A2 | 12 | 四个分量,无符号归一化 10 位 R、G 和 B,2 位 Alpha。这是一种打包格式,因此适用于本机端位。请注意没有 BGR10A2。这是因为 RGB10A2 映射到 D3D 的 DXGI_FORMAT_R10G10B10A2_UNORM、Metal 的 MTLPixelFormatRGB10A2Unorm、Vulkan 的 VK_FORMAT_A2B10G10R10_UNORM_PACK32,以及 OpenGL (ES) 的 GL_RGB10_A2/GL_RGB/GL_UNSIGNED_INT_2_10_10_10_REV。这是唯一普遍支持的 RGB30 选项。相应的QImage 格式为QImage::Format_BGR30 和QImage::Format_A2BGR30_Premultiplied. (共 32 位) |
QRhiTexture::D16 | 17 | 16 位深度(归一化无符号整数) |
QRhiTexture::D24 | 18 | 24 位深度(规范化无符号整数) |
QRhiTexture::D24S8 | 19 | 24 位深度(规范化无符号整数),8 位模板 |
QRhiTexture::D32F | 20 | 32 位深度(32 位浮点数) |
QRhiTexture::D32FS8 (since Qt 6.9) | 21 | 32 位深度(32 位浮点),8 位模板,24 位未使用(共 64 位) |
QRhiTexture::BC1 | 22 | |
QRhiTexture::BC2 | 23 | |
QRhiTexture::BC3 | 24 | |
QRhiTexture::BC4 | 25 | |
QRhiTexture::BC5 | 26 | |
QRhiTexture::BC6H | 27 | |
QRhiTexture::BC7 | 28 | |
QRhiTexture::ETC2_RGB8 | 29 | |
QRhiTexture::ETC2_RGB8A1 | 30 | |
QRhiTexture::ETC2_RGBA8 | 31 | |
QRhiTexture::ASTC_4x4 | 32 | |
QRhiTexture::ASTC_5x4 | 33 | |
QRhiTexture::ASTC_5x5 | 34 | |
QRhiTexture::ASTC_6x5 | 35 | |
QRhiTexture::ASTC_6x6 | 36 | |
QRhiTexture::ASTC_8x5 | 37 | |
QRhiTexture::ASTC_8x6 | 38 | |
QRhiTexture::ASTC_8x8 | 39 | |
QRhiTexture::ASTC_10x5 | 40 | |
QRhiTexture::ASTC_10x6 | 41 | |
QRhiTexture::ASTC_10x8 | 42 | |
QRhiTexture::ASTC_10x10 | 43 | |
QRhiTexture::ASTC_12x10 | 44 | |
QRhiTexture::ASTC_12x12 | 45 | |
QRhiTexture::R8UI (since Qt 6.9) | 13 | 一个分量,无符号 8 位。(共 8 位) |
QRhiTexture::R32UI (since Qt 6.9) | 14 | 一个元件,无符号 32 位。(共 32 位) |
QRhiTexture::RG32UI (since Qt 6.9) | 15 | 两个元件,无符号 32 位。(共 64 位) |
QRhiTexture::RGBA32UI (since Qt 6.9) | 16 | 四个元件,无符号 32 位。(共 128 位) |
成员函数文档
int QRhiTexture::arrayRangeLength() const
返回调用setArrayRange() 时显示的数组范围大小。
另请参阅 setArrayRange()。
int QRhiTexture::arrayRangeStart() const
返回调用setArrayRange() 时的第一个数组层。
另请参阅 setArrayRange()。
int QRhiTexture::arraySize() const
返回纹理数组的大小。
另请参阅 setArraySize()。
[pure virtual]
bool QRhiTexture::create()
创建相应的本地图形资源。如果由于之前的 create() 没有相应的destroy() 而导致资源已经存在,则会先隐式调用destroy()。
成功时返回true
,图形操作失败时返回false
。无论返回值如何,调用destroy() 总是安全的。
[virtual]
bool QRhiTexture::createFrom(QRhiTexture::NativeTexture src)
与create() 类似,但不会创建新的本地纹理。取而代之的是使用src 指定的本地纹理资源。
这样就可以从外部图形引擎导入现有的本地纹理对象(必须属于同一设备或共享上下文,具体取决于图形 API)。
如果指定的现有本地纹理对象已成功包装为非所有QRhiTexture ,则返回 true。
注意: format()、pixelSize()、sampleCount() 和flags() 仍必须正确设置。如果向QRhi::newTexture() 传递不正确的尺寸和其他值,然后再用 createFrom() 方法进行后续操作,以为仅凭本机纹理对象就足以推断出这些值,这样做是错误的,会导致问题。
注意: QRhiTexture 并不拥有纹理对象的所有权。destroy()不会释放对象或任何相关内存。
与此操作相反,可以通过nativeTexture() 将QRhiTexture 创建的本地纹理对象公开给外来引擎。
注意: 在导入三维纹理或纹理数组对象时,或者在使用 OpenGL ES 时导入外部纹理时,尤其需要在调用此函数之前通过setFlags() 设置相应的标志 (ThreeDimensional,TextureArray,ExternalOES)。
int QRhiTexture::depth() const
返回 3D 纹理的深度。
另请参阅 setDepth()。
QRhiTexture::Flags QRhiTexture::flags() const
返回纹理标志。
另请参阅 setFlags()。
QRhiTexture::Format QRhiTexture::format() const
返回纹理格式。
另请参阅 setFormat()。
[virtual]
QRhiTexture::NativeTexture QRhiTexture::nativeTexture()
返回此纹理的底层本地资源。如果后端不支持公开底层本地资源,则返回值为空。
另请参阅 createFrom()。
QSize QRhiTexture::pixelSize() const
以像素为单位返回大小。
另请参阅 setPixelSize()。
[since 6.8]
QRhiTexture::ViewFormat QRhiTexture::readViewFormat() const
返回纹理采样时使用的视图格式。未调用时,视图格式假定与format() 相同。
此函数在 Qt 6.8 中引入。
另请参阅 setReadViewFormat()。
[override virtual]
QRhiResource::Type QRhiTexture::resourceType() const
重实现:QRhiResource::resourceType() 常量。
返回资源类型。
int QRhiTexture::sampleCount() const
返回采样计数。1 表示无多采样抗锯齿。
另请参见 setSampleCount()。
void QRhiTexture::setArrayRange(int startIndex, int count)
通常情况下,所有数组层都会暴露出来,着色器可以在对sampler2DArray
采样时,通过传递给texture()
GLSL 函数的第三个坐标来选择层。当QRhi::TextureArrayRange 被报告为支持时,在create() 或createFrom() 之前调用 setArrayRange() 只要求选择指定范围,即从startIndex 开始的count 元素。着色器逻辑的编写可以考虑到这一点。
另请参见 QRhi::TextureArrayRange 。
void QRhiTexture::setArraySize(int arraySize)
设置纹理arraySize 。
另请参阅 arraySize() 。
void QRhiTexture::setDepth(int depth)
设置三维纹理的depth 。
另请参阅 depth()。
void QRhiTexture::setFlags(QRhiTexture::Flags f)
将纹理标志设置为f 。
另请参阅 flags() 。
void QRhiTexture::setFormat(QRhiTexture::Format fmt)
将请求的纹理格式设置为fmt 。
注意: 只有在下一次调用create() 时,即底层图形资源被(重新)创建时,才会考虑所设置的值。否则,设置新值是徒劳的,而且必须避免,因为这会导致状态不一致。
另请参见 format()。
[virtual]
void QRhiTexture::setNativeLayout(int layout)
对于某些图形 API(如 Vulkan),集成直接使用图形 API 的自定义渲染代码时需要特别注意图像布局。该函数允许在执行本机渲染命令后,与支持QRhiTexture 的图像所处的预期layout 进行通信。
例如,考虑在QRhiCommandBuffer::beginExternal() 和QRhiCommandBuffer::endExternal() 包围的代码块中直接使用 Vulkan 渲染QRhiTexture 的 VkImage,然后在基于QRhi 的渲染传递中使用该图像进行纹理采样。为了避免可能出现的图像布局转换错误,可以使用该函数来指示上述代码块中记录的命令完成后的图像布局。
只有在QRhiCommandBuffer::endExternal() 之后和随后的QRhiCommandBuffer::beginPass() 之前调用此函数才有意义。
该函数对QRhi 后端没有影响,因为在这些后端中,底层图形 API 没有图像布局的概念。
注: 对于 Vulkan,layout 是VkImageLayout
。对于 Direct 3D 12,layout 是由D3D12_RESOURCE_STATES
的位组成的值。
void QRhiTexture::setPixelSize(const QSize &sz)
将纹理大小(以像素为单位)设置为sz 。
注意: 只有在下一次调用create() 时,即底层图形资源被(重新)创建时,才会考虑所设置的值。否则,设置新值是徒劳的,必须避免,因为这会导致状态不一致。这同样适用于所有其他设置器。
另请参阅 pixelSize()。
[since 6.8]
void QRhiTexture::setReadViewFormat(const QRhiTexture::ViewFormat &fmt)
将着色器资源视图格式(或用于纹理采样的视图格式)设置为fmt 。默认情况下,使用与纹理本身相同的格式(和 sRGB-ness),在大多数情况下无需调用此函数。
只有在报告支持QRhi::TextureViewFormat 功能时才会考虑该设置。
注: 提供此功能是为了允许在非 RGB 和 sRGB 之间进行 "转换",以便着色器读取或不读取隐式 sRGB 转换。其他类型的转换可能有效,也可能无效。
此函数在 Qt 6.8 中引入。
另请参阅 readViewFormat()。
void QRhiTexture::setSampleCount(int s)
将采样计数设置为s 。
另请参阅 sampleCount() 。
[since 6.8]
void QRhiTexture::setWriteViewFormat(const QRhiTexture::ViewFormat &fmt)
将渲染目标视图格式设置为fmt 。默认情况下,会使用与纹理本身相同的格式(和 sRGB-ness),因此在大多数情况下无需调用此函数。
提供写入视图格式的一个常见用例是使用外部提供的纹理,这些纹理在我们的控制范围之外,使用 Vulkan 或 Direct 3D 等 3D API 使用 sRGB 格式,但渲染引擎已经准备好在着色管道末端处理线性化并转换为 sRGB。在这种情况下,渲染到这种纹理时需要的是具有相同但非 RGB 格式的渲染目标视图(如 VkImageView)。(例如,如果从 OpenXR 实现中得到一个 VK_FORMAT_R8G8B8A8_SRGB 纹理,那么如果渲染引擎的流水线要求使用 VK_FORMAT_R8G8B8A8_UNORM 视图,则很可能需要使用 VK_FORMAT_R8G8B8A8_UNORM 视图对其进行渲染;在此示例中,我们将使用格式为QRhiTexture::RGBA8 的ViewFormat 并将srgb
设置为false
来调用此函数)。
只有在报告支持QRhi::TextureViewFormat 功能时,才会考虑这一设置。
注: 提供此功能是为了允许在非 RGB 和 sRGB 之间 "转换",以便着色器不执行或执行隐式 sRGB 转换。其他类型的转换可能有效,也可能无效。
此函数在 Qt 6.8 中引入。
另请参阅 writeViewFormat()。
[since 6.8]
QRhiTexture::ViewFormat QRhiTexture::writeViewFormat() const
返回写入纹理和使用图像载入/存储时使用的视图格式。未调用时,视图格式假定与format() 相同。
此函数在 Qt 6.8 中引入。
另请参阅 setWriteViewFormat()。
© 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.