本页内容

QRhiTexture Class

纹理资源。更多...

头文件: #include <rhi/qrhi.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
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, …, RGBA32SI }

公共函数

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 ` 标志。 具有Mipmap的纹理必须设置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 。

成员类型文档

enum QRhiTexture::Flag
flags QRhiTexture::Flags

用于指定纹理使用方式的标志值。若不遵守在调用 `create()` 之前设置的标志,或尝试以未事先声明的方式使用纹理,可能会导致未定义的行为或性能下降,具体取决于后端和底层图形 API。

常量值描述
QRhiTexture::RenderTarget1 << 0该纹理将与QRhiTextureRenderTarget 配合使用。
QRhiTexture::CubeMap1 << 2该纹理为立方贴图。此类纹理包含 6 个层,分别对应 +X、-X、+Y、-Y、+Z、-Z 方向的六个面。立方贴图纹理不支持多采样。
QRhiTexture::MipMapped1 << 3该纹理具有细化图。合适的细化图数量会自动计算,也可通过QRhi::mipLevelsForSize()获取。各细化级别的图像必须包含在上传的纹理中,或通过QRhiResourceUpdateBatch::generateMips()生成。多采样纹理不能包含细化图。
QRhiTexture::sRGB1 << 4请使用 sRGB 格式。
QRhiTexture::UsedAsTransferSource1 << 5该纹理用作纹理复制或回读的源,即在QRhiResourceUpdateBatch::copyTexture() 或QRhiResourceUpdateBatch::readBackTexture() 中将其指定为源。
QRhiTexture::UsedWithGenerateMips1 << 6该纹理将与QRhiResourceUpdateBatch::generateMips() 一起使用。
QRhiTexture::UsedWithLoadStore1 << 7该纹理将用于图像加载/存储操作,例如在计算着色器中。
QRhiTexture::UsedAsCompressedAtlas1 << 8该纹理采用压缩格式,且子资源上传的尺寸可能与纹理尺寸不匹配。
QRhiTexture::ExternalOES1 << 9该纹理应在 OpenGL 中使用 GL_TEXTURE_EXTERNAL_OES 目标。在其他图形 API 中,此标志将被忽略。
QRhiTexture::ThreeDimensional1 << 10该纹理是 3D 纹理。此类纹理应使用QRhi::newTexture() 的重载函数创建,该函数除了宽度和高度外还需指定深度。3D 纹理可以具有 Mipmap,但不能是多采样纹理。 在向三维纹理渲染或上传数据时,渲染目标的颜色附件或上传描述中指定的layer 指代范围[0..depth-1]内的单个切片。底层图形API可能在运行时不支持三维纹理。QRhi::ThreeDimensionalTextures 特性表示是否支持。
QRhiTexture::TextureRectangleGL1 << 11在 OpenGL 中,纹理应使用 GL_TEXTURE_RECTANGLE 目标。在其他图形 API 中,此标志将被忽略。与 ExternalOES 一样,当处理平台 API 时,此标志非常有用——此时,从平台接收的原生 OpenGL 纹理对象被封装在QRhiTexture 中,且平台仅能提供非 2D 纹理目标的纹理。
QRhiTexture::TextureArray1 << 12该纹理为纹理数组,即一个由2D纹理组成的同质数组所构成的单一纹理对象。 纹理数组通过QRhi::newTextureArray()创建。底层图形API在运行时可能不支持纹理数组对象。对此的支持由QRhi::TextureArrays 特性指示。在向纹理数组渲染或上传数据时,渲染目标的颜色附件或上传描述中指定的layer 将选择数组中的单个元素。
QRhiTexture::OneDimensional1 << 13该纹理为一维纹理。可通过向QRhi::newTexture() 传递高度和深度均为 0 的参数来创建此类纹理。请注意,根据底层图形 API 的不同,一维纹理可能会受到某些限制。例如,可能不支持向其渲染或将其与基于 MIP 图的过滤结合使用。这由QRhi::OneDimensionalTextures 和QRhi::OneDimensionalTextureMipmaps 功能标志所指示。
QRhiTexture::UsedAsShadingRateMap1 << 14 

Flags 类型是QFlags<Flag> 的 typedef。它存储 Flag 值的按“或”(OR)运算组合。

enum QRhiTexture::Format

指定纹理格式。另请参阅QRhi::isTextureFormatSupported(),并请注意,当QRhiTexture::sRGB 被设置时,flags() 可以修改该格式。

常量值描述
QRhiTexture::UnknownFormat0非有效格式。此参数不能传递给setFormat()。
QRhiTexture::RGBA81四个分量,每个分量为无符号归一化 8 位。始终受支持。(总计 32 位)
QRhiTexture::BGRA82四个分量,每个分量为无符号归一化 8 位。(总计 32 位)
QRhiTexture::R83一个分量,无符号归一化 8 位。(总计 8 位)
QRhiTexture::RG84两个分量,每个分量为无符号归一化 8 位。(总计 16 位)
QRhiTexture::R165一个分量,无符号归一化 16 位。(总计 16 位)
QRhiTexture::RG166两个分量,每个分量为无符号归一化 16 位。(总计 32 位)
QRhiTexture::RED_OR_ALPHA87与 R8 相同,或采用类似格式但将分量交换至 alpha 通道,具体取决于RedOrAlpha8IsRed 。(总计 8 位)
QRhiTexture::RGBA16F8四个分量,16 位浮点数。(共计 64 位)
QRhiTexture::RGBA32F9四分量,32 位浮点数。(总计 128 位)
QRhiTexture::R16F10一个分量,16 位浮点数。(总计 16 位)
QRhiTexture::R32F11一个分量,32 位浮点数。(总计 32 位)
QRhiTexture::RGB10A212四个分量,无符号归一化 10 位 R、G 和 B,2 位 alpha。这是一种紧凑格式,因此适用本机字节序。 请注意,不存在 BGR10A2 格式。这是因为 RGB10A2 在 D3D 中映射为 DXGI_FORMAT_R10G10B10A2_UNORM,在 Metal 中映射为 MTLPixelFormatRGB10A2Unorm, Vulkan中的VK_FORMAT_A2B10G10R10_UNORM_PACK32,以及OpenGL (ES)。这是唯一被普遍支持的 RGB30 选项。相应的QImage 格式为QImage::Format_BGR30 和QImage::Format_A2BGR30_Premultiplied 。(总计 32 位)
QRhiTexture::D162116 位色深(归一化无符号整数)
QRhiTexture::D242224 位色深(归一化无符号整数)
QRhiTexture::D24S82324 位色深(归一化无符号整数),8 位模板
QRhiTexture::D32F2432 位色深(32 位浮点数)
QRhiTexture::D32FS8 (since Qt 6.9)2532 位深度(32 位浮点数),8 位模板位,24 位未使用(总计 64 位)
QRhiTexture::BC126 
QRhiTexture::BC227 
QRhiTexture::BC328 
QRhiTexture::BC429 
QRhiTexture::BC530 
QRhiTexture::BC6H31 
QRhiTexture::BC732 
QRhiTexture::ETC2_RGB833 
QRhiTexture::ETC2_RGB8A134 
QRhiTexture::ETC2_RGBA835 
QRhiTexture::ASTC_4x436 
QRhiTexture::ASTC_5x437 
QRhiTexture::ASTC_5x538 
QRhiTexture::ASTC_6x539 
QRhiTexture::ASTC_6x640 
QRhiTexture::ASTC_8x541 
QRhiTexture::ASTC_8x642 
QRhiTexture::ASTC_8x843 
QRhiTexture::ASTC_10x544 
QRhiTexture::ASTC_10x645 
QRhiTexture::ASTC_10x846 
QRhiTexture::ASTC_10x1047 
QRhiTexture::ASTC_12x1048 
QRhiTexture::ASTC_12x1249 
QRhiTexture::R8UI (since Qt 6.9)17一个组件,无符号 8 位。(共 8 位)
QRhiTexture::R32UI (since Qt 6.9)18一个分量,无符号 32 位。(共 32 位)
QRhiTexture::RG32UI (since Qt 6.9)19两个分量,无符号 32 位。(总计 64 位)
QRhiTexture::RGBA32UI (since Qt 6.9)20四个分量,无符号32位。(共128位)
QRhiTexture::R8SI (since Qt 6.10)13一个分量,带符号 8 位。(共 8 位)
QRhiTexture::R32SI (since Qt 6.10)14一个分量,带符号 32 位。(共 32 位)
QRhiTexture::RG32SI (since Qt 6.10)15两个分量,32 位带符号。(总计 64 位)
QRhiTexture::RGBA32SI (since Qt 6.10)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() 不会释放该对象或任何相关内存。

该操作的反向操作——即将由QRhiTexture 创建的原生纹理对象暴露给外部引擎——可通过nativeTexture() 实现。

注意:在 导入 3D 纹理、纹理数组对象,或者在 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() const。

返回资源类型。

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)

设置 3D 纹理的“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 的自定义渲染代码时,需要特别注意图像布局问题。此函数允许在执行原生渲染命令后,指定layout 中QRhiTexture 所对应的图像的预期布局。

例如,假设在由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属性),因此在大多数情况下无需调用此函数。

只有当报告支持QRhi::TextureViewFormat 功能时,此设置才会生效。

注意: 提供此 功能是为了允许在非 sRGB 和 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属性),因此在大多数情况下无需调用此函数。

提供写入视图格式的常见用例之一是处理外部提供的纹理:这些纹理在我们的控制范围之外,使用Vulkan或Direct 3D等3D API时采用了sRGB格式,但渲染引擎已在着色管道末端做好了处理线性化和转换为sRGB的准备。 在这种情况下,渲染到此类纹理时所需的是具有相同(但非 sRGB)格式的渲染目标视图(例如 VkImageView)。 (例如,如果从 OpenXR 实现中获取到 VK_FORMAT_R8G8B8A8_SRGB 纹理, 那么若渲染引擎的管道有此要求,渲染时很可能应使用 VK_FORMAT_R8G8B8A8_UNORM 视图;在此示例中,应调用该函数并传入一个格式为QRhiTexture::RGBA8 、且srgb 设置为false 的ViewFormat 对象)。

只有当报告支持QRhi::TextureViewFormat 功能时,才会考虑此设置。

注意: 提供此 功能是为了允许在非 sRGB 和 sRGB 之间进行“类型转换”,从而使着色器写入操作不执行或执行隐式 sRGB 转换。其他类型的转换可能有效,也可能无效。

该函数在 Qt 6.8 中引入。

另请参阅 writeViewFormat()。

[since 6.8] QRhiTexture::ViewFormat QRhiTexture::writeViewFormat() const

返回在向纹理写入数据以及在图像加载/存储操作中使用该纹理时所采用的视图格式。若未调用此函数,则默认视图格式与format() 中的设置相同。

该函数在 Qt 6.8 中引入。

另请参阅 setWriteViewFormat()。

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