QRhiTexture 类
纹理资源。 更多信息...
头文件 | #include <QRhiTexture> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake | QT += gui |
自 | Qt 6.6 |
继承 | QRhiResource |
公共类型
结构体 | NativeTexture |
枚举 | Flag { RenderTarget, CubeMap, MipMapped, sRGB, UsedAsTransferSource, …, OneDimensional } |
标志位 | 标志位 |
枚举 | Format { UnknownFormat, RGBA8, BGRA8, R8, RG8, …, ASTC_12x12 } |
公共函数
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 |
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) |
void | setSampleCount(int s) |
重写的公共函数
virtual QRhiResource::Type | resourceType() const override |
详细描述
QRhiTexture 封装了原生纹理对象,例如 VkImage
或 MTLTexture
。
QRhiTexture 实例总是通过调用 QRhi 的 newTexture() 函数 创建的。这不会创建原生图形资源。为了做这件事,在设置适当的选项(如格式和大小)后调用 create(),尽管在大多数情况下这些选项已经根据传递给 newTexture() 的参数进行了设置。
正确设置标志是至关重要的,否则可能会根据底层QRhi后端和图形API出现各种错误。例如,当纹理将通过QRhiTextureRenderTarget从渲染通道进行渲染时,必须创建带有RenderTarget标志的纹理。同样地,当纹理即将进行读取回时,必须先设置UsedAsTransferSource标志。具有米级别(Mip)的纹理必须设置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(),则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::RenderTarget | 1 << 0 | 将使用与QRhiTextureRenderTarget一起使用的纹理。 |
QRhiTexture::CubeMap | 1 << 2 | 纹理是立方体贴图。此类纹理有6个层,每个面一个层,顺序为+X,-X,+Y,-Y,+Z,-Z。立方体贴图不能是多重样本。 |
QRhiTexture::MipMapped | 1 << 3 | 纹理具有米级别(Mip)。适当的米级别计数将自动计算,也可以通过QRhi::mipLevelsForSize获取。米级别图像必须通过上传到纹理或通过QRhiResourceUpdateBatch::generateMips生成的纹理来提供。多重样本纹理不能具有米级别。 |
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() 重载来创建,除了宽度和高度外还需要深度。3D 纹理可以有米级别,但不能是多重采样。在渲染到或上传数据到 3D 纹理时,渲染目标颜色附件或上传描述中指定的 层 指的是 [0..深度-1] 范围内的单个切片。底层图形 API 可能不支持在运行时 3D 纹理。支持是通过 QRhi::ThreeDimensionalTextures 功能指示。 |
QRhiTexture::TextureRectangleGL | 1 << 11 | 纹理应使用 OpenGL 的 GL_TEXTURE_RECTANGLE 目标。此标志在除其他图形 API 外的情况被忽略。类似于 ExternalOES,此标志在与平台 API 一起使用时很有用,其中从平台收到的本地 OpenGL 纹理对象被包裹在一个 QRhiTexture 中,而平台只能提供非 2D 纹理目标纹理。 |
QRhiTexture::TextureArray | 1 << 12 | 纹理是一个纹理数组,即一个单纹理对象,是一个 2D 纹理的同构数组。纹理数组是用 QRhi::newTextureArray 创建的。底层图形 API 可能不支持在运行时纹理数组对象。支持是通过 QRhi::TextureArrays 功能指示。在渲染到或上传数据到纹理数组时,渲染目标的颜色附件或上传描述中指定的 层 选择数组的单个元素。 |
QRhiTexture::OneDimensional | 1 << 13 | 纹理是一个 1D 纹理。可以通过传递宽度、高度和深度的 0 来创建此类纹理。请注意,根据底层图形 API,一维纹理可能会有限制。例如,渲染到它们或使用基于米级别的过滤可能不受支持。这是通过 QRhi::OneDimensionalTextures 和 QRhi::OneDimensionalTextureMipmaps 功能标志指示的。 |
类型 Flags 是为 QFlags<Flag> 而声明的。它存储了 Flag 值的 OR 组合。
枚举 QRhiTexture::Format
指定纹理格式。另请参阅 QRhi::isTextureFormatSupported() 并注意,当 QRhiTexture::sRGB 设置时,flags() 可以修改格式。
常量 | 值 | 描述 |
---|---|---|
QRhiTexture::UnknownFormat | 0 | 不是一个有效的格式。不能传递给 setFormat。 |
QRhiTexture::RGBA8 | 1 | 四个组件,每个组件无符号正常化 8 位。始终受支持。 |
QRhiTexture::BGRA8 | 2 | 四个组件,每个组件无符号正常化 8 位。 |
QRhiTexture::R8 | 3 | 一个组件,无符号正常化 8 位。 |
QRhiTexture::RG8 | 4 | 两个组件,无符号正常化 8 位。 |
QRhiTexture::R16 | 5 | 一个组件,无符号正常化 16 位。 |
QRhiTexture::RG16 | 6 | 两个组件,无符号正常化 16 位。 |
QRhiTexture::RED_OR_ALPHA8 | 7 | 与 R8 相同,或者根据 RedOrAlpha8IsRed 是红或类似的格式,组件已交换到 alpha。 |
QRhiTexture::RGBA16F | 8 | 四个分量,每个分量16位浮点数字。 |
QRhiTexture::RGBA32F | 9 | 四个分量,每个分量32位浮点数字。 |
QRhiTexture::R16F | 10 | 一个分量,16位浮点数字。 |
QRhiTexture::R32F | 11 | 一个分量,32位浮点数字。 |
QRhiTexture::RGB10A2 | 12 | 四个分量,每个分量是无符号归一化10位红、绿、蓝,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。 |
QRhiTexture::D16 | 13 | 16位深度(归一化无符号整数) |
QRhiTexture::D24 | 14 | 24位深度(归一化无符号整数) |
QRhiTexture::D24S8 | 15 | 24位深度(归一化无符号整数),8位模板缓冲区 |
QRhiTexture::D32F | 16 | 32位深度(32位浮点数字) |
QRhiTexture::BC1 | 17 | |
QRhiTexture::BC2 | 18 | |
QRhiTexture::BC3 | 19 | |
QRhiTexture::BC4 | 20 | |
QRhiTexture::BC5 | 21 | |
QRhiTexture::BC6H | 22 | |
QRhiTexture::BC7 | 23 | |
QRhiTexture::ETC2_RGB8 | 24 | |
QRhiTexture::ETC2_RGBA8A1 | 25 | |
QRhiTexture::ETC2_RGBA8 | 26 | |
QRhiTexture::ASTC_4x4 | 27 | |
QRhiTexture::ASTC_5x4 | 28 | |
QRhiTexture::ASTC_5x5 | 29 | |
QRhiTexture::ASTC_6x5 | 30 | |
QRhiTexture::ASTC_6x6 | 31 | |
QRhiTexture::ASTC_8x5 | 32 | |
QRhiTexture::ASTC_8x6 | 33 | |
QRhiTexture::ASTC_8x8 | 34 | |
QRhiTexture::ASTC_10x5 | 35 | |
QRhiTexture::ASTC_10x6 | 36 | |
QRhiTexture::ASTC_10x8 | 37 | |
QRhiTexture::ASTC_10x10 | 38 | |
QRhiTexture::ASTC_12x10 | 39 | |
QRhiTexture::ASTC_12x12 | 40 |
成员函数文档
int QRhiTexture::arrayRangeLength() const
当调用setArrayRange()时,返回公开的数组范围大小。
另请参阅setArrayRange。
int QRhiTexture::arrayRangeStart() const
当调用setArrayRange()时,返回第一个数组层。
另请参阅setArrayRange。
int QRhiTexture::arraySize() const
返回纹理数组大小。
另请参阅setArraySize。
[纯虚函数]
bool QRhiTexture::create()
创建相应的本地图形资源。如果没有较早的带有相应destroy()的create()调用而存在资源,则隐式调用destroy()。
当成功时返回true,当图形操作失败时返回false。无论返回值如何,调用destroy()总是安全的。
[虚函数]
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()。
[虚函数]
QRhiTexture::NativeTexture QRhiTexture::nativeTexture()
返回此纹理的下层原生资源。如果后端不支持暴露底层原生资源,则返回的值将为空。
另请参阅 createFrom()。
QSize QRhiTexture::pixelSize() const
返回像素大小。
另请参阅 setPixelSize()。
[重写虚函数]
QRhiResource::Type QRhiTexture::resourceType() const
重实: QRhiResource::resourceType() const.
返回资源类型。
int QRhiTexture::sampleCount() const
返回采样数。1表示没有多重样本抗锯齿。
另请参阅 setSampleCount()。
void QRhiTexture::setArrayRange(int startIndex, int count)
通常所有数组层都会被暴露,并且通过传递到 texture()
GLSL 函数的第三个坐标来选择层,这是由着色器在采样 sampler2DArray
时完成的。当 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().
[虚拟]
void QRhiTexture::setNativeLayout(int layout)
对于一些图形API,例如Vulkan,如果直接使用图形API进行自定义渲染,则需要在对图像布局的处理上特别小心。此函数允许在执行本地渲染命令后,传达预期图像所处的layout。
例如,考虑在代码块中使用Vulkan直接向QRhiTexture的VkImage渲染,该代码块被QRhiCommandBuffer::beginExternal()和QRhiCommandBuffer::endExternal()包围,然后在该QRhi基于的渲染通道中使用该图像进行纹理采样。为了避免可能不正确的图像布局转换,此函数可用于指示在记录上述代码块中的命令完成后图像将处于何种布局。
只有在使用QRhiCommandBuffer::endExternal()之后,并在后续的QRhiCommandBuffer::beginPass()之前调用此函数才有意义。
对于不公开图像布局概念的底层图形API的QRhi后端,此函数没有效果。
注意: 在Vulkan中,layout 是 VkImageLayout
。在Direct 3D 12中,layout 是由 D3D12_RESOURCE_STATES
中的位组成的值。
void QRhiTexture::setPixelSize(const QSize &sz)
将纹理大小设置为像素,为sz。
注意: 设置的值只在下一次调用create()时生效,即当底层图形资源被创建或重新创建时。否则设置新的值是徒劳的,并且必须避免,因为它可能导致不一致的状态。同样适用于所有其他setter。
另请参阅 pixelSize().
void QRhiTexture::setSampleCount(int s)
将采样计数设置为s。
另请参阅 sampleCount().
© 2024 Qt公司有限公司。本文档中包含的文档贡献是各自所有者的版权。本提供的文档是根据由自由软件基金会发布的《GNU自由文档许可协议》第1.3版许可使用。Qt和相关标志是芬兰以及世界各地的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。