本页内容

QQuick3DInstancing Class

用于定义实例表的基类。更多...

Header: #include <QQuick3DInstancing>
Since: Qt 6.2
In QML: Instancing
Inherits: QQuick3DObject

属性

公共函数

bool depthSortingEnabled() const
bool hasTransparency() const
int instanceCountOverride() const
QVector3D shadowBoundsMaximum() const
QVector3D shadowBoundsMinimum() const

公共槽位

void setDepthSortingEnabled(bool enabled)
void setHasTransparency(bool hasTransparency)
void setInstanceCountOverride(int instanceCountOverride)
void setShadowBoundsMaximum(const QVector3D &newShadowBoundsMinimum)
void setShadowBoundsMinimum(const QVector3D &newShadowBoundsMinimum)

信号

受保护函数

virtual QByteArray getInstanceBuffer(int *instanceCount) = 0
void markDirty()

静态受保护成员

QQuick3DInstancing::InstanceTableEntry calculateTableEntry(const QVector3D &position, const QVector3D &scale, const QVector3D &eulerRotation, const QColor &color, const QVector4D &customData = {})
QQuick3DInstancing::InstanceTableEntry calculateTableEntryFromQuaternion(const QVector3D &position, const QVector3D &scale, const QQuaternion &rotation, const QColor &color, const QVector4D &customData = {})

详细说明

可以继承 QQuick3DInstancing 类,为Qt Quick 3D 场景中的模型指定自定义实例表。

该类是抽象类:要使用它,请创建一个子类并实现 `getInstanceBuffer()` 方法。

属性文档

depthSortingEnabled : bool

保存实例表中“启用深度排序”的值。启用后,实例将按照从相机最远处的实例到最近处的顺序进行排序和渲染,即从后到前。如果禁用(这是默认设置),则实例将按照其在实例表中的指定顺序进行渲染。

注意:实例 仅相互之间进行排序。实例不会与场景中的其他对象进行排序。

注意: 排序会 增加帧准备时间,尤其当实例数量较多时。

访问函数:

bool depthSortingEnabled() const
void setDepthSortingEnabled(bool enabled)

通知器信号:

void depthSortingEnabledChanged()

hasTransparency : bool

如果实例化表中包含在渲染模型时应使用的透明度值,请将此属性设置为 true。此属性仅在模型为不透明时才起作用:如果模型具有透明的material ,或者opacity 小于 1,则无论如何都会使用表中的透明度值。

注意:启用 透明度混合可能会导致实例重叠时出现渲染问题。详情请参阅透明度混合和实例化文档。

访问函数:

bool hasTransparency() const
void setHasTransparency(bool hasTransparency)

通知器信号:

void hasTransparencyChanged()

instanceCountOverride : int

设置此属性可在不重新生成或重新上传实例表的情况下限制实例数量。这使得渲染的实例数量能够以极低的开销进行动画调整。

访问函数:

int instanceCountOverride() const
void setInstanceCountOverride(int instanceCountOverride)

通知器信号:

void instanceCountOverrideChanged()

[since 6.9] shadowBoundsMaximum : QVector3D

设置计算实例表中模型的阴影贴图边界时所使用的最大边界。

默认值:(-1, -1, -1)

注意: 仅当shadowBoundsMinimum 的相应组件小于shadowBoundsMaximum中的值时,此 属性才生效。否则,边界将自动计算。

此枚举类型自 Qt 6.9 起引入。

访问函数:

QVector3D shadowBoundsMaximum() const
void setShadowBoundsMaximum(const QVector3D &newShadowBoundsMinimum)

通知器信号:

void shadowBoundsMaximumChanged()

另请参阅 shadowBoundsMinimum 。

[since 6.9] shadowBoundsMinimum : QVector3D

设置计算实例表中模型的阴影贴图边界时所使用的最小边界。

默认值:(1, 1, 1)

注意: 仅当 shadowBoundsMinimum 的相应组件小于 `shadowBoundsMaximum` 中的值时,此 属性才生效。否则,边界将自动计算。

此枚举类型自 Qt 6.9 起引入。

访问函数:

QVector3D shadowBoundsMinimum() const
void setShadowBoundsMinimum(const QVector3D &newShadowBoundsMinimum)

通知器信号:

void shadowBoundsMinimumChanged()

另请参阅 shadowBoundsMaximum 。

成员函数文档

[static protected] QQuick3DInstancing::InstanceTableEntry QQuick3DInstancing::calculateTableEntry(const QVector3D &position, const QVector3D &scale, const QVector3D &eulerRotation, const QColor &color, const QVector4D &customData = {})

将position 、scale 、eulerRotation 、color 和customData 转换为标准顶点着色器所期望的实例表格式。典型示例:

QByteArray MyInstanceTable::getInstanceBuffer(int *instanceCount)
{
    QByteArray instanceData;

    ...

    auto entry = calculateTableEntry({xPos, yPos, zPos}, {xScale, yScale, zScale}, {xRot, yRot, zRot}, color, {});
    instanceData.append(reinterpret_cast<const char *>(&entry), sizeof(entry));

另请参阅 calculateTableEntryFromQuaternion 。

[static protected] QQuick3DInstancing::InstanceTableEntry QQuick3DInstancing::calculateTableEntryFromQuaternion(const QVector3D &position, const QVector3D &scale, const QQuaternion &rotation, const QColor &color, const QVector4D &customData = {})

将position 、scale 、rotation 、color 和customData 转换为标准顶点着色器所期望的实例表格式。

这与calculateTableEntry() 相同,只是使用四元数来指定旋转。

[pure virtual protected] QByteArray QQuick3DInstancing::getInstanceBuffer(int *instanceCount)

实现此函数以返回实例表的内容。实例的数量应通过instanceCount 返回。子类负责在必要时缓存结果。如果实例表发生变化,子类应调用markDirty()。

[protected] void QQuick3DInstancing::markDirty()

请注意,实例数据已发生变化,必须重新上传。

另请参阅 getInstanceBuffer 和instanceCountOverride 。

© 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.