Qt Quick 3D 细节级别
细节级别 (LoD)
细节级别(LoD)是指在距离摄像机不同位置时,使用 3D 模型的不同版本的技术。 这样做的目的是通过在模型距离较远或仅占据屏幕一小部分时使用较简单的版本,而在模型距离较近或占据较大屏幕空间时使用更精细的版本,从而优化资源使用。这种方法可以在保持视觉保真度的同时,高效利用 GPU 资源。
Qt Quick 3D 提供自动和显式两种细节等级系统。自动系统基于使用单个网格,并在网格文件中存储多个细节等级。显式系统则基于使用“LodManager ”组件,将不同的细节等级指定为子模型。
自动细节级别
使用自动细节级别功能的主要方式是通过Balsam 资源导入工具导入内容。在导入资源时启用“--generateMeshLevelsOfDetail ”标志,该工具将在可能的情况下为每个网格生成不同细节级别。具体实现方式是尝试简化原始网格的几何结构,同时保留其整体特征。 其结果是,每个新增的细节级别都会产生额外的几何体以及新的索引值,同时还会生成一个距离因子,用于根据给定的渲染尺寸确定应使用哪个网格。 该距离系数与被渲染对象到摄像机的距离相关,但最重要的是确保每像素的几何体比例合理。这些数据会被写入 .mesh 文件,并在模型使用时自动应用。

自动系统的权衡之处,也是其默认未启用的原因在于:当几何体被简化时,可能会引入视觉伪影。 所使用的几何体简化算法会尽力保留模型的特征,但在某些情况下,可能需要重新计算网格的法线以保持预期的视觉效果。这可以通过在导入资源时使用--recalculateLodNormals 标志来实现。 可以通过向参数--recalculateLodNormalsMergeAngle 和--recalculateLodNormalsSplitAngle 传入欧拉角值,分别控制法线合并或拆分时的角度,从而进一步调整法线重新计算过程。
自动系统的最大优势在于,只要使用适当的设置导入资产,它就非常易于使用。使用自动系统无需额外编写代码,且任何引用了包含不同细节级别几何体的生成的网格文件的模型,都会根据模型在屏幕上占用的像素数量自动选择合适的几何体。
可以通过在global level 或per-model level 中,使用Camera 或Model 的levelOfDetailBias 属性来调整自动细节级别选择的行为。这些偏移属性各自的默认值1.0表示完全采用自动系统计算出的数值。 该值是对理想值的偏移量,因此小于 1.0 的值将要求渲染尺寸更小才会切换到较低的细节级别。大于 1.0 的值将导致更早地使用较低的细节级别。 值为 0.0 时将完全禁用细节级别功能,并始终使用原始网格几何体。
自动系统不如显式系统灵活。例如,自动系统对所有细节级别始终使用相同的材质,这未必总是理想的。另一个潜在的缺点是,不同细节级别之间没有过渡效果——虽然在自动细节级别下这在理想情况下本不必要,但在某些使用场景下可能是有益的。
显式细节级别
显式细节级别系统比自动系统更灵活,但使用起来需要更多操作。 显式系统基于使用LodManager 组件,将其作为子Model 组件来指定不同的细节级别。作为LodManager 的任何子节点,只要是Model的实例,都会被视为一个细节级别。这非常强大,因为每个细节级别都可以是一个完全自定义的模型,拥有自己的几何体和材质。
LodManager 组件还具有一个distances 属性,用于确定使用哪个子Model 。当摄像机距离接近各距离边界时,LodManager 节点将过渡到下一个子Model 。可通过fadeDistance 属性设置在距离边界附近开始和结束淡入淡出过渡的距离。
以下是一个关于如何使用显式细节级别系统的示例:

在引用的示例中,通过LodManager 显式指定了大理石半身像各细节等级对应的不同网格文件。
LodManager {
camera: camera
distances: [100, 140, 180]
fadeDistance: 10
Model {
scale: Qt.vector3d(100, 100, 100);
source: "meshes/marble_bust_01_LOD_0.mesh"
materials: [ marbleMaterial ]
}
Model {
scale: Qt.vector3d(100, 100, 100);
source: "meshes/marble_bust_01_LOD_1.mesh"
materials: [ marbleMaterial ]
}
Model {
scale: Qt.vector3d(100, 100, 100);
source: "meshes/marble_bust_01_LOD_2.mesh"
materials: [ marbleMaterial ]
}
Model {
scale: Qt.vector3d(100, 100, 100);
source: "meshes/marble_bust_01_LOD_3.mesh"
materials: [ marbleMaterial ]
}
}针对此代码,下图展示了其定义内容,指出了如何使用距离列表来定义不同细节级别之间的边界,以及用于定义交叉淡入淡出过渡的 fadeDistance 属性。

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