QSGTexture Class
QSGTexture 类是场景图中使用的纹理的基类。更多内容...
| 头文件: | #include <QSGTexture> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake: | QT += quick |
| 继承自: | QObject |
| 被继承自: |
公共类型
| enum | AnisotropyLevel { AnisotropyNone, Anisotropy2x, Anisotropy4x, Anisotropy8x, Anisotropy16x } |
| enum | Filtering { None, Nearest, Linear } |
| enum | WrapMode { Repeat, ClampToEdge, MirroredRepeat } |
公共函数
| QSGTexture() | |
| virtual | ~QSGTexture() override |
| QSGTexture::AnisotropyLevel | anisotropyLevel() const |
(since 6.0) virtual void | commitTextureOperations(QRhi *rhi, QRhiResourceUpdateBatch *resourceUpdates) |
| virtual qint64 | comparisonKey() const = 0 |
| QRectF | convertToNormalizedSourceRect(const QRectF &rect) const |
| QSGTexture::Filtering | filtering() const |
| virtual bool | hasAlphaChannel() const = 0 |
| virtual bool | hasMipmaps() const = 0 |
| QSGTexture::WrapMode | horizontalWrapMode() const |
| virtual bool | isAtlasTexture() const |
| QSGTexture::Filtering | mipmapFiltering() const |
| QNativeInterface * | nativeInterface() const |
| virtual QRectF | normalizedTextureSubRect() const |
| virtual QSGTexture * | removedFromAtlas(QRhiResourceUpdateBatch *resourceUpdates = nullptr) const |
(since 6.0) virtual QRhiTexture * | rhiTexture() const |
| void | setAnisotropyLevel(QSGTexture::AnisotropyLevel level) |
| void | setFiltering(QSGTexture::Filtering filter) |
| void | setHorizontalWrapMode(QSGTexture::WrapMode hwrap) |
| void | setMipmapFiltering(QSGTexture::Filtering filter) |
| void | setVerticalWrapMode(QSGTexture::WrapMode vwrap) |
| virtual QSize | textureSize() const = 0 |
| QSGTexture::WrapMode | verticalWrapMode() const |
详细说明
用户可以自由实现自己的纹理类,以支持任意输入纹理,例如 YUV 视频帧或 8 位透明度蒙版。场景图为 RGBA 纹理提供了默认实现。默认实现不会被直接实例化,而是通过工厂函数(如 `QQuickWindow::createTextureFromImage()`)进行构建。
在默认实现中,每个 QSGTexture 都由一个QRhiTexture 作为后端支持,而该对象又包含一个本机纹理对象,例如 OpenGL 纹理或 Vulkan 图像。
像素尺寸由textureSize() 提供。hasAlphaChannel() 用于返回纹理是否包含不透明度值,而hasMipmaps() 用于返回纹理是否包含 Mipmap 级别。
Materials 与纹理配合使用的函数需重写updateSampledImage(),以提供逻辑,决定在给定的着色器资源绑定点上应暴露哪个 QSGTexture 的底层原生纹理。
QSGTexture 不将图像(纹理)和采样器对象分离。可以通过setMipmapFiltering()、setFiltering()、setHorizontalWrapMode() 和setVerticalWrapMode() 指定过滤和折叠的参数。场景图和 Qt 的图形抽象层会在适用时负责创建独立的采样器对象。
纹理图集
某些场景图后端会使用纹理图集,即将多个小纹理合并为一个大纹理。如果采用这种方式,函数isAtlasTexture() 将返回 true。图集用于辅助渲染算法进行更优的排序,从而提升性能。 纹理图集对于批处理(合并几何体以减少绘制调用次数)也至关重要,因为使用两个不同 QSGTexture 的相同材质实例无法进行批处理;而如果这两个 QSGTexture 都引用同一个纹理图集,且在其他方面材质兼容,则可以进行批处理。
纹理在纹理集中的位置可通过normalizedTextureSubRect() 函数获取。
如果纹理的使用方式不适合使用图集,可以使用removedFromAtlas() 函数提取一份未纳入图集的副本。
注意:所有 以 QSG 为前缀的类应仅在场景图的渲染线程上使用。有关更多信息,请参阅“场景图与渲染”。
成员类型文档
enum QSGTexture::AnisotropyLevel
指定当纹理未与屏幕对齐时要使用的各向异性过滤级别。
| 常量 | 值 | 描述 |
|---|---|---|
QSGTexture::AnisotropyNone | 0 | 不进行各向异性过滤。 |
QSGTexture::Anisotropy2x | 1 | 2x 各向异性过滤。 |
QSGTexture::Anisotropy4x | 2 | 4x 各向异性过滤。 |
QSGTexture::Anisotropy8x | 3 | 8x 各向异性过滤。 |
QSGTexture::Anisotropy16x | 4 | 16 倍各向异性过滤。 |
enum QSGTexture::Filtering
指定当纹理坐标未与像素对齐时,纹理像素的采样应如何进行过滤。
| 常量 | 值 | 描述 |
|---|---|---|
QSGTexture::None | 0 | 不应进行任何过滤。此值仅与setMipmapFiltering() 配合使用。 |
QSGTexture::Nearest | 1 | 采样返回最近的纹素。 |
QSGTexture::Linear | 2 | 采样返回相邻纹理像素的线性插值结果。 |
enum QSGTexture::WrapMode
指定采样器应如何处理纹理坐标。
| 常量 | 值 | 描述 |
|---|---|---|
QSGTexture::Repeat | 0 | 仅使用纹理坐标的小数部分,这会导致大于 1 和小于 0 的值发生重复。 |
QSGTexture::ClampToEdge | 1 | 大于 1 的值会被限制为 1,小于 0 的值会被限制为 0。 |
QSGTexture::MirroredRepeat | 2 | 当纹理坐标为偶数时,仅使用小数部分;当为奇数时,纹理坐标被设置为1 - fractional part 。该值自 Qt 5.10 起引入。 |
成员函数文档
QSGTexture::QSGTexture()
构建 QSGTexture 基类。
[override virtual noexcept] QSGTexture::~QSGTexture()
销毁QSGTexture 。
QSGTexture::AnisotropyLevel QSGTexture::anisotropyLevel() const
返回用于过滤此纹理的各向异性级别。
另请参阅 setAnisotropyLevel()。
[virtual, since 6.0] void QSGTexture::commitTextureOperations(QRhi *rhi, QRhiResourceUpdateBatch *resourceUpdates)
调用此函数可将图像上传操作加入resourceUpdates 的队列,以防存在任何待处理的操作。当没有新数据时(例如,自上次调用此函数以来未调用setImage()),该函数不执行任何操作。
涉及rhi 纹理的材质应在其updateSampledImage() 实现中调用此函数,通常无需任何条件,并从QSGMaterialShader::RenderState 传入state.rhi() 和state.resourceUpdateBatch() 。
警告:此 函数只能在渲染线程中调用。
该函数于 Qt 6.0 中引入。
[pure virtual] qint64 QSGTexture::comparisonKey() const
返回一个适用于纹理比较的键。通常用于QSGMaterial::compare()的实现中。
仅比较QSGTexture 指针并不总是足够的,因为两个引用同一底层本机纹理对象的QSGTexture 实例也应被视为相等。因此需要此函数。
该函数的实现不应、也不应在不存在任何图形资源(本机纹理对象)的情况下创建任何图形资源。
一个底层没有本机纹理对象的QSGTexture 通常不与其他任何QSGTexture 相等,因此必须相应地处理返回值。但也有例外情况,特别是当使用纹理图集(atlasing)时(此时多个纹理在底层共享同一个图集纹理),具体处理方式应由子类实现酌情决定。
警告:此 函数只能在渲染线程中调用。
QRectF QSGTexture::convertToNormalizedSourceRect(const QRectF &rect) const
返回已转换为归一化坐标的rect 。
另请参阅 normalizedTextureSubRect()。
QSGTexture::Filtering QSGTexture::filtering() const
返回此纹理所使用的采样模式。
另请参阅 setFiltering()。
[pure virtual] bool QSGTexture::hasAlphaChannel() const
如果纹理数据包含Alpha通道,则返回true。
[pure virtual] bool QSGTexture::hasMipmaps() const
如果纹理数据包含Mipmap级别,则返回 true。
QSGTexture::WrapMode QSGTexture::horizontalWrapMode() const
返回此纹理将使用的水平换行模式。
另请参阅 setHorizontalWrapMode()。
[virtual] bool QSGTexture::isAtlasTexture() const
返回此纹理是否属于纹理图集。
默认实现返回 false。
QSGTexture::Filtering QSGTexture::mipmapFiltering() const
返回从该纹理采样时是否应使用MIP映射。
另请参阅 setMipmapFiltering()。
template <typename QNativeInterface> QNativeInterface *QSGTexture::nativeInterface() const
返回该纹理的指定类型的本机接口。
该函数可访问QSGTexture 中平台特有的功能,这些功能在QNativeInterface 命名空间中已声明:
提供对 Direct3D 11 纹理对象的访问并启用其采用 | |
提供对 Direct3D 12 纹理对象的访问并支持其采用 | |
提供对 Metal 纹理对象的访问并支持其采用 | |
提供对 OpenGL 纹理对象的访问并支持其采用 | |
提供对 Vulkan 图像对象的访问并支持其采用 |
这允许访问底层本机纹理对象,例如 OpenGL 中的GLuint 纹理 ID,或 Vulkan 中的VkImage 句柄。
如果请求的接口不可用,则返回一个nullptr 。
[virtual] QRectF QSGTexture::normalizedTextureSubRect() const
返回该纹理在textureSize()中表示的矩形,以归一化坐标表示。
默认实现返回一个位于 (0, 0) 位置、宽高均为 1 的矩形。
[virtual] QSGTexture *QSGTexture::removedFromAtlas(QRhiResourceUpdateBatch *resourceUpdates = nullptr) const
该函数返回当前纹理的副本,并将该副本从其纹理图集中移除。
当前纹理保持不变,因此无需更新纹理坐标。
从纹理图集中移除纹理,主要是在将其传递给着色器时非常有用,该着色器处理的是纹理坐标 0-1,而不是纹理图集内的纹理子矩形。
如果纹理不属于纹理图集,则此函数返回 0。
建议该函数的实现对于多次调用返回相同的实例,以限制内存使用。
resourceUpdates 是一个可选的资源更新批处理,纹理操作(如有)将排队到该批处理中。材质可以从QSGMaterialShader::RenderState 获取一个实例。当为空时,removedFromAtlas() 的实现会创建自己的批处理并立即提交。但是,当指定了一个有效的实例时,该函数将不会提交更新批处理。
警告:此 函数只能从渲染线程调用。
[virtual, since 6.0] QRhiTexture *QSGTexture::rhiTexture() const
返回此QSGTexture 对应的QRhiTexture ,若不存在则返回null(可能是因为内部尚未创建有效的纹理,也可能是因为该概念不适用于当前使用的场景图后端)。
如果不存在QRhiTexture ,该函数不应创建新的 。在这种情况下,它应返回 null。渲染器的预期行为是:当纹理为 null 时,应改用透明的虚拟纹理。
警告:此 函数只能在渲染线程中调用。
该函数在 Qt 6.0 中引入。
void QSGTexture::setAnisotropyLevel(QSGTexture::AnisotropyLevel level)
将各向异性过滤级别设置为level 。默认值为QSGTexture::AnisotropyNone ,这意味着未启用各向异性过滤。
注意: 根据所使用的图形 API不同,该请求 可能会被忽略。无法保证运行时支持各向异性过滤。
另请参阅 anisotropyLevel()。
void QSGTexture::setFiltering(QSGTexture::Filtering filter)
将采样模式设置为filter 。
另请参阅 filtering()。
void QSGTexture::setHorizontalWrapMode(QSGTexture::WrapMode hwrap)
将水平换行模式设置为hwrap
另请参阅 horizontalWrapMode()。
void QSGTexture::setMipmapFiltering(QSGTexture::Filtering filter)
将Mipmap采样模式设置为filter 。
如果纹理没有米普图,则设置米普图过滤不会产生任何效果。
另请参阅 mipmapFiltering() 和hasMipmaps()。
void QSGTexture::setVerticalWrapMode(QSGTexture::WrapMode vwrap)
将垂直换行模式设置为vwrap
另请参阅 verticalWrapMode()。
[pure virtual] QSize QSGTexture::textureSize() const
返回纹理的大小(以像素为单位)。
QSGTexture::WrapMode QSGTexture::verticalWrapMode() const
返回此纹理将使用的垂直折行模式。
另请参阅 setVerticalWrapMode()。
© 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.