QSGMaterial 类

QSGMaterial 类封装了着色器程序的渲染状态。 更多信息...

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

QSGFlatColorMaterialQSGOpaqueTextureMaterial、以及 QSGVertexColorMaterial

公共类型

枚举Flag { Blending, RequiresDeterminant, RequiresFullMatrixExceptTranslate, RequiresFullMatrix, NoBatching, CustomCompileStep }
标志标志

公共函数

virtual intcompare(const QSGMaterial *other) const
virtual QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const = 0
QSGMaterial::Flagsflags() const
voidsetFlag(QSGMaterial::Flags flags, bool on = true)
virtual QSGMaterialType *type() const = 0

详细描述

QSGMaterial 和 QSGMaterialShader 派生类之间形成一个紧密的关系。对于场景图(包括嵌套图),有一个唯一的 QSGMaterialShader 实例封装了场景图渲染该材料时所使用的着色器,如用于几何体扁平着色的着色器。每个 QSGGeometryNode 可以有一个唯一的 QSGMaterial,其中包含在绘制节点时如何配置着色器的信息,例如用于绘制几何体的实际颜色。

QSGMaterial 有两个需要实现的虚拟函数。函数 type() 应为特定子类的所有实例返回一个唯一的实例。函数 createShader() 应返回一个特定于 QSGMaterial 子类的 QSGMaterialShader 的新实例。

一个最小的 QSGMaterial 实现可能看起来像这样

class Material : public QSGMaterial
{
public:
    QSGMaterialType *type() const override { static QSGMaterialType type; return &type; }
    QSGMaterialShader *createShader(QSGRendererInterface::RenderMode) const override { return new Shader; }
};

请参阅 自定义材料示例,了解在 QQuickItem 子类后面使用 QSGGeometryNode 和自定义材料的实现方法。

注意:每个createShader() 仅在每个 QSGMaterialType 调用一次,以减少着色器准备过程中的冗余工作。如果一个 QSGMaterial 由多个顶点着色器和片断着色器组合支持,则 type() 的实现必须为每个着色器组合返回一个不同、唯一的 QSGMaterialType 指针。

注意:所有以 QSG 为前缀的类应该在场景图渲染线程上单独使用。有关更多信息,请参见 场景图和渲染

另请参阅 QSGMaterialShader场景图 - 自定义材料场景图 - 两个纹理提供者,和 场景图 - 图

成员类型文档

枚举 QSGMaterial::Flag
标志 QSGMaterial::Flags

常数描述
QSGMaterial::Blending0x0001将此标志设置为 true,如果材料在渲染期间需要启用混合。
QSGMaterial::RequiresDeterminant0x0002将此标志设置为 true,如果材料在渲染上依赖于几何节点矩阵的行列式。
QSGMaterial::RequiresFullMatrixExceptTranslate0x0004 | RequiresDeterminant将此标志设置为 true,如果材料在渲染上依赖于几何节点的完整矩阵,除了平移部分。
QSGMaterial::RequiresFullMatrix0x0008 | RequiresFullMatrixExceptTranslate将此标志设置为 true,如果材料在渲染上依赖于几何节点的完整矩阵。
QSGMaterial::NoBatching0x0010如果材料使用与场景图的批处理机制不兼容的着色器,将此标志设置为 true。这适用于某些高级用法,例如在顶点着色器中直接操作 gl_Position.z。这种解决方案通常与特定的场景结构相关联,并且很可能不安全地与场景中任意内容一起使用。因此,应在适当调查后设置此标志,并且对于大多数材料来说,永远不会需要它。设置此标志可能导致由于需要发出更多绘制调用而性能降低。此标志是在 Qt 6.3 中引入的。
QSGMaterial::CustomCompileStepNoBatching在 Qt 6 中,此标志与 NoBatching 相同。建议使用 NoBatching。

Flags 类型是 QFlags 的类型定义。它存储 Flag 值的或组合。

成员函数文档

[virtual] int QSGMaterial::compare(const QSGMaterial *other) const

将此材料与 other 进行比较,如果它们相同则返回 0;如果 other 应在 other 前排序则返回 -1,反之亦然。

场景图可以重新排列几何节点以最小化状态变化。比较函数在排序过程中被调用,以便将材料排序,以使每次调用 QSGMaterialShader::updateState() 时的状态更改最小化。

此指针和 other 保证具有相同的 type()。

[pure virtual] QSGMaterialShader *QSGMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const

此函数返回一个用于渲染特定 QSGMaterial 实现几何图形的 QSGMaterialShader 实现的新实例。

该函数会为每种材料类型和 渲染模式 的组合调用一次,并且会在内部进行缓存。

对于大多数材料,可以忽略 渲染模式。一些材料可能需要针对特定渲染模式进行自定义处理。例如,如果材料以在 RenderMode3D 使用时需要考虑透视变换的方式实现抗锯齿。

QSGMaterial::Flags QSGMaterial::flags() const

返回材料的标志。

void QSGMaterial::setFlag(QSGMaterial::Flags flags, bool on = true)

on 为 true 时,在此材料上设置标志 flags,否则清除该属性。

[纯虚函数] QSGMaterialType *QSGMaterial::type() const

此函数由场景图调用,以查询由 createShader() 实例化的 QSGMaterialShader 的唯一标识符。

对于许多材料,典型的方法是返回一个指向静态和全局可用的 QSGMaterialType 实例的指针。QSGMaterialType 是一个不可见对象。它的目的是作为一个类型安全、简单的方式来生成唯一的材料标识符。

QSGMaterialType *type() const override
{
    static QSGMaterialType type;
    return &type;
}

© 2024 The Qt Company Ltd. 本文件中的文档贡献权属于各自的拥有者。本文件提供的文档受 GNU 自由文档许可证版本 1.3 的条款许可,由自由软件基金会发布。Qt 及其相关标志是 The Qt Company Ltd 在芬兰和/或其他国家/地区的商标。所有其他商标均为其各自所有者的财产。