QSGTexture 类
QSGTexture 类是场景图中使用的纹理的基类。更多...
头文件 | #include <QSGTexture> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake | QT += quick |
继承自 | QObject |
继承 |
公共类型
枚举 | AnisotropyLevel { AnisotropyNone, Anisotropy2x, Anisotropy4x, Anisotropy8x, Anisotropy16x } |
枚举 | Filtering { None, Nearest, Linear } |
枚举 | 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位alpha掩码。场景图提供了RGBA纹理的默认实现。默认实现不是直接实例化,而是通过工厂函数构建,例如QQuickWindow::createTextureFromImage()。
在默认实现中,每个QSGTexture都由一个QRhiTexture来支持,它又包含一个原生纹理对象,例如OpenGL纹理或Vulkan图像。
像素大小由textureSize()给出。 hasAlphaChannel()报告纹理是否包含不透明度值,而hasMipmaps()报告纹理是否包含Mipmap级别。
材质在处理纹理时重写了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 | 16x各向异性过滤。 |
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 - 小数部分 。这个值自Qt 5.10中引入。 |
成员函数文档
QSGTexture::QSGTexture()
构造QSGTexture基类。
[覆盖虚函数 noexcept]
QSGTexture::~QSGTexture()
销毁QSGTexture。
QSGTexture::AnisotropyLevel QSGTexture::anisotropyLevel() const
返回用于过滤此纹理所使用的各向异性级别。
另请参阅setAnisotropyLevel。
[虚函数,自6.0开始]
void QSGTexture::commitTextureOperations(QRhi *rhi, QRhiResourceUpdateBatch *resourceUpdates)
调用此函数将图像上传操作入队到resourceUpdates,如果有任何挂起的操作。如果没有新数据(例如,因为自上次调用此函数以来没有setImage()),则函数不执行任何操作。
涉及rhi纹理的材料应在其updateSampledImage()实现中调用此函数,通常不需要任何条件,传递从QSGMaterialShader::RenderState中获取的state.rhi()
和state.resourceUpdateBatch()
。
警告:此函数只能从渲染线程调用。
此函数自Qt 6.0引入。
[纯虚函数]
qint64 QSGTexture::comparisonKey() const
返回适合比较纹理的键。通常用于QSGMaterial::compare()实现。
仅仅比较QSGTexture指针并不总是足够的,因为两个QSGTexture实例可能指向同一个底层的原生纹理对象,也应该被认为是相等的。因此需要这个函数。
此函数的实现预期不会也不会创建任何图形资源(原生纹理对象),如果还没有的话。
一个没有底层原生纹理对象的QSGTexture典型情况下不代表任何其他QSGTexture,所以返回值必须相应地构建。有例外,特别是当使用atlas时(多个纹理在底层共享同一个atlas纹理),这留给了子类的实现酌情处理。
警告:此函数只能从渲染线程调用。
QRectF QSGTexture::convertToNormalizedSourceRect(const QRectF &rect) const
返回已转换为归一化坐标的rect。
QSGTexture::Filtering QSGTexture::filtering() const
返回用于此纹理的采样模式。
另请参阅setFiltering。
[纯虚函数]
bool QSGTexture::hasAlphaChannel() const
如果纹理数据包含alpha通道,则返回true。
[纯虚函数]
bool QSGTexture::hasMipmaps() const
如果纹理数据包含mipmap级别,则返回true。
QSGTexture::WrapMode QSGTexture::horizontalWrapMode() const
返回用于此纹理的水平环绕模式。
[虚函数]
bool QSGTexture::isAtlasTexture() const
返回此纹理是否是图集的一部分。
默认实现返回false。
QSGTexture::Filtering QSGTexture::mipmapFiltering() const
返回是否在从此纹理采样时使用mipmap。
另请参阅setMipmapFiltering。
template <typename QNativeInterface> QNativeInterface *QSGTexture::nativeInterface() const
返回给定类型的纹理的本机接口。
此函数提供了访问QSGTexture的平台特定功能,如QNativeInterface命名空间中所述。
提供对Direct3D 11纹理对象的访问和领用 | |
提供对Direct3D 12纹理对象的访问和领用 | |
提供对Metal纹理对象的访问和领用 | |
提供对OpenGL纹理对象的访问和领用 | |
提供对Vulkan图像对象的访问和领用 |
这允许访问底层本机纹理对象,例如,使用OpenGL的GLuint
纹理ID,或者使用Vulkan的VkImage
句柄。
如果请求的接口不可用,则返回nullptr
。
[虚函数]
QRectF QSGTexture::normalizedTextureSubRect() const
返回在textureSize
()中的矩形,该矩形在此纹理的归一化坐标系中表示。
默认实现返回位置为(0, 0),宽度为1和高度为1的矩形。
[虚函数]
QSGTexture *QSGTexture::removedFromAtlas(QRhiResourceUpdateBatch *resourceUpdates = nullptr) const
此函数返回当前纹理的副本,该纹理已从其图集中删除。
当前纹理保持不变,因此不需要更新纹理坐标。
从图集中删除纹理主要用于将其传递给在纹理坐标0-1上操作的着色器,而不是传递到图集中的纹理子矩形。
如果纹理不是纹理图集的一部分,则该函数返回 0。
建议该函数的实现在多次调用中返回相同的实例,以限制内存使用。
resourceUpdates 是一个可选的资源更新批次,纹理操作(如果有的话)会排队在该批次上。材料可以从 QSGMaterialShader::RenderState 中检索一个实例。当为 null 时,removedFromAtlas() 的实现会创建自己的批次并立即提交它。然而,当指定了有效的实例时,该函数不会提交更新批次。
警告:此函数只能从渲染线程调用。
[虚拟,自 6.0]
QRhiTexture *QSGTexture::rhiTexture() const
返回此 QSGTexture 的 QRhiTexture 或 null(因为可能尚未创建有效的纹理,或者该概念不适用于所使用的场景图后端)。
如果当前没有 QRhiTexture,则此函数不会创建新的 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)
将米柏采样模式设置为 filter。
如果纹理没有米柏,则设置米柏过滤没有效果。
另请参阅:mipmapFiltering() 和 hasMipmaps()。
void QSGTexture::setVerticalWrapMode(QSGTexture::WrapMode vwrap)
设置垂直包装模式为 vwrap
另请参阅:verticalWrapMode()。
[纯虚拟]
QSize QSGTexture::textureSize() const
返回纹理的像素大小。
QSGTexture::WrapMode QSGTexture::verticalWrapMode() const
返回用于此纹理的垂直包装模式。
另请参阅:setVerticalWrapMode()。
© 2024 Qt公司有限公司。本文档中包含的贡献均为各自所有者的版权所有。本文档的提供受《自由软件基金会发布的GNU自由文档许可协议版本1.3》的条款约束。GNU自由文档许可协议版本1.3是自由软件基金会发布的。Qt及其相关标志是芬兰及/或全球其他国家的Qt公司商标。所有其他商标均属于其各自所有者。