QSGTexture 类

QSGTexture 类是场景图中使用的纹理的基类。更多...

头文件 #include <QSGTexture>
CMakefind_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmakeQT += quick
继承自 QObject
继承

QSGDynamicTexture

公共类型

枚举AnisotropyLevel { AnisotropyNone, Anisotropy2x, Anisotropy4x, Anisotropy8x, Anisotropy16x }
枚举Filtering { None, Nearest, Linear }
枚举WrapMode { Repeat, ClampToEdge, MirroredRepeat }

公共函数

QSGTexture()
virtual~QSGTexture() override
QSGTexture::AnisotropyLevelanisotropyLevel() const
(since 6.0) virtual voidcommitTextureOperations(QRhi *rhi, QRhiResourceUpdateBatch *resourceUpdates)
virtual qint64comparisonKey() const = 0
QRectFconvertToNormalizedSourceRect(const QRectF &rect) const
QSGTexture::Filteringfiltering() const
virtual boolhasAlphaChannel() const = 0
virtual boolhasMipmaps() const = 0
QSGTexture::WrapModehorizontalWrapMode() const
virtual boolisAtlasTexture() const
QSGTexture::FilteringmipmapFiltering() const
QNativeInterface *nativeInterface() const
virtual QRectFnormalizedTextureSubRect() const
virtual QSGTexture *removedFromAtlas(QRhiResourceUpdateBatch *resourceUpdates = nullptr) const
(since 6.0) virtual QRhiTexture *rhiTexture() const
voidsetAnisotropyLevel(QSGTexture::AnisotropyLevel level)
voidsetFiltering(QSGTexture::Filtering filter)
voidsetHorizontalWrapMode(QSGTexture::WrapMode hwrap)
voidsetMipmapFiltering(QSGTexture::Filtering filter)
voidsetVerticalWrapMode(QSGTexture::WrapMode vwrap)
virtual QSizetextureSize() const = 0
QSGTexture::WrapModeverticalWrapMode() 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::AnisotropyNone0无各向异性过滤。
QSGTexture::Anisotropy2x12x各向异性过滤。
QSGTexture::Anisotropy4x24x各向异性过滤。
QSGTexture::Anisotropy8x38x各向异性过滤。
QSGTexture::Anisotropy16x416x各向异性过滤。

enum QSGTexture::Filtering

指定在纹理坐标未对齐到像素时应该如何过滤采样。

常量描述
QSGTexture::None0不应发生过滤。此值仅与setMipmapFiltering()一起使用。
QSGTexture::Nearest1采样返回最近纹理单元。
QSGTexture::Linear2采样返回相邻纹理单元的线性插值。

enum QSGTexture::WrapMode

指定采样器应该如何处理纹理坐标。

常量描述
QSGTexture::Repeat0仅使用纹理坐标的小数部分,导致值在1以上和0以下重复。
QSGTexture::ClampToEdge1大于1的值会被限制为1,小于0的值会被限制为0。
QSGTexture::MirroredRepeat2当纹理坐标为偶数时,仅使用小数部分。当为奇数时,纹理坐标将被设置为 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

另请参阅normalizedTextureSubRect

QSGTexture::Filtering QSGTexture::filtering() const

返回用于此纹理的采样模式。

另请参阅setFiltering

[纯虚函数] bool QSGTexture::hasAlphaChannel() const

如果纹理数据包含alpha通道,则返回true。

[纯虚函数] bool QSGTexture::hasMipmaps() const

如果纹理数据包含mipmap级别,则返回true。

QSGTexture::WrapMode QSGTexture::horizontalWrapMode() const

返回用于此纹理的水平环绕模式。

另请参阅setHorizontalWrapMode

[虚函数] bool QSGTexture::isAtlasTexture() const

返回此纹理是否是图集的一部分。

默认实现返回false。

QSGTexture::Filtering QSGTexture::mipmapFiltering() const

返回是否在从此纹理采样时使用mipmap。

另请参阅setMipmapFiltering

template <typename QNativeInterface> QNativeInterface *QSGTexture::nativeInterface() const

返回给定类型的纹理的本机接口。

此函数提供了访问QSGTexture的平台特定功能,如QNativeInterface命名空间中所述。

QNativeInterface::QSGD3D11Texture

提供对Direct3D 11纹理对象的访问和领用

QNativeInterface::QSGD3D12Texture

提供对Direct3D 12纹理对象的访问和领用

QNativeInterface::QSGMetalTexture

提供对Metal纹理对象的访问和领用

QNativeInterface::QSGOpenGLTexture

提供对OpenGL纹理对象的访问和领用

QNativeInterface::QSGVulkanTexture

提供对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

返回此 QSGTextureQRhiTexture 或 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公司商标。所有其他商标均属于其各自所有者。