主题
模型 LOD 选择与配置
LOD(Level of Detail)用于让模型在离相机较远、画面中占比较小时切换到更低面数的网格,从而降低顶点处理、蒙皮和绘制成本。
星火 2.0 已提供三层调节方式:
- 模型资源配置:决定有几级 LOD、每一级的减面结果和基础切换位置。
- 项目画质偏移:为节能、中、高画质统一追加若干级降档。
- 运行时代码偏置:通过相机或单个模型的
LodBias,动态调整高精度模型保持的距离。
大多数项目只需要在美术工作台配置模型 LOD,并在真机上调整项目画质偏移。只有相机类型特殊、模型尺寸差异很大,或者需要动态性能策略时,才需要修改 LodBias。
运行时怎样选择 LOD
运行时不会只按“距离相机多少米”切换,也不会每帧读取模型实际覆盖了多少屏幕像素。它会综合以下因素得到一个归一化的 LOD 距离:
- 相机到模型包围盒中心的距离;
- 模型包围盒尺寸;
- 相机
LodBias; - 模型组件
LodBias; - 相机
Zoom。
透视相机下可以近似理解为:
text
归一化 LOD 距离
= 相机到模型的距离
/(模型尺寸 × 相机 LodBias × 模型 LodBias × 相机 Zoom)模型越远或越小,归一化距离越大,越容易进入低精度 LOD;模型越大,即使实际距离相同,也会更晚降级。
模型资源为各级 LOD 保存了递增的切换阈值。假设资源包含 LOD0、LOD1、LOD2,阈值为 T1、T2:
| 归一化距离 | 使用的模型 |
|---|---|
距离 <= T1 | LOD0,最高精度 |
T1 < 距离 <= T2 | LOD1 |
距离 > T2 | LOD2,最低精度 |
当前切换是直接切换,没有自动淡入淡出或滞回区间。若阈值过于接近,镜头在临界位置移动时可能看到模型来回跳变。
正交相机使用正交视图尺寸参与计算,而不是按模型与相机的前后距离切换。因此正交项目需要单独检查缩放镜头时的表现。
在美术工作台配置模型 LOD
在美术工作台选择可编辑的模型或预制体后,使用“LOD 模式配置”生成和调整 LOD。
可以配置:
- LOD 数量;
- 每一级保留的三角面比例;
- 硬边角度、基于哪一级继续减面;
- 骨骼或模型局部的减面权重;
- 自动计算或手动填写“屏幕尺寸”。
使用预设
编辑器提供大尺寸、中尺寸、小尺寸和极小尺寸等预设。预设会一次性填入 LOD 数量、减面比例和切换参数,适合先获得可用结果,再根据真机效果微调。
不要只按模型资源文件的尺寸选择预设。应按模型在实际游戏镜头中的视觉占比选择:大型建筑、Boss 和近景展示模型通常需要更晚降级;远景装饰、碎石和小道具可以更早降级。
自动计算屏幕尺寸
开启自动计算后,编辑器会根据减面后的几何误差估算切换距离。这个模式适合:
- 模型比例和包围盒正确;
- 自动减面的误差能够代表实际视觉损失;
- 希望同一批资源使用一致规则。
自动结果仍应在游戏实际相机和目标设备上检查。透明边缘、轮廓明显的模型、带细长结构的模型,以及依赖特定骨骼轮廓的角色,单靠几何误差可能无法给出理想阈值。
手动配置屏幕尺寸
关闭自动计算后,可以为每一级 LOD 手动填写“屏幕尺寸”。它是编辑器用于换算切换距离的归一化参数,不是运行时精确测量的像素百分比。
- 数值越大:越早切到该级 LOD,对象还比较大时就会降级。
- 数值越小:越晚切到该级 LOD,上一精度会保持得更远。
- 后续低精度 LOD 的数值应逐级减小。
如果某一级在近处就出现,降低该级的屏幕尺寸;如果模型已经很小却仍使用高面数 LOD,提高该级的屏幕尺寸。
配置不同画质的 LOD 偏移
在编辑器菜单打开:
text
设置 → LOD偏移等级可以分别配置节能、中、高画质的整数偏移。静态模型先按距离选择基础 LOD,再追加当前画质的偏移:
text
最终 LOD 等级 = 距离选择的等级 + 画质偏移例如模型按距离本应使用 LOD1,节能画质偏移为 1,最终会使用 LOD2。结果不会超过模型已有的最低精度等级。
建议从以下配置开始:
| 画质 | 建议起点 |
|---|---|
| 高 | 0 |
| 中 | 0 或 1 |
| 节能 | 1 或 2 |
较低画质的偏移不应小于较高画质。最终数值应根据场景模型数量、角色数量、目标机型 GPU 和可接受画质确定。
> 当前项目画质偏移只应用于普通静态模型。骨骼动画模型仍使用资源阈值、相机 LodBias 和自身 LodBias,不会追加这里的整数偏移。
使用 GameGraph 调整 LOD
模型渲染和网格资源操作属于客户端表现能力,相关代码应放在 #if CLIENT 中。
调整整个相机的 LOD
csharp
#if CLIENT
camera.LodBias = 1.25f;
#endif调整单个模型的 LOD
StaticMeshComponent 和 AnimatedModelComponent 都继承了 Drawable.LodBias:
csharp
#if CLIENT
model.LodBias = 0.8f;
#endifLodBias 的方向如下:
| 设置 | 效果 |
|---|---|
大于 1 | 高精度 LOD 保持得更远,画质更高、开销更大 |
等于 1 | 使用资源的基础规则 |
小于 1 | 更早切换到低精度 LOD,开销更低 |
相机和模型的偏置会相乘。若两处同时修改,应记录各自用途,避免调整一个值时被另一个值抵消。
修改具体几何体的切换阈值
高级工具或运行时生成网格可以直接访问 LOD 几何体:
csharp
#if CLIENT
Geometry? lod1 = mesh.GetGeometry(geometryIndex: 0, lodLevel: 1);
if (lod1 != null)
{
lod1.LodDistance = 120f;
}
#endif普通项目不建议运行时修改已加载模型资源的 LodDistance:Mesh 和其中的 Geometry 通常是共享资源,修改后可能同时影响所有引用该模型的实例。优先使用实例级 model.LodBias。
AnimationLodBias 不是模型 LOD
AnimatedModelComponent.AnimationLodBias 控制远处骨骼动画的更新频率,用于减少动画计算开销;它不会选择 LOD0、LOD1 或 LOD2 网格。
角色性能优化时可以同时使用两套能力:
- 模型
LodBias/ 资源阈值:减少远处角色的网格复杂度; AnimationLodBias:降低远处角色的骨骼动画更新频率。
不要把两者当成同一个参数。
应该调整哪一层
| 需求 | 推荐调整 |
|---|---|
| 某个模型所有实例都切换得不合理 | 美术工作台中的模型 LOD 屏幕尺寸 |
| 某类大型或重点模型需要保持高精度 | 该模型实例的 LodBias,或单独调整资源阈值 |
| 整个镜头下所有模型都降级过早/过晚 | 相机 LodBias |
| 低配设备希望静态场景统一再降一级 | “设置 → LOD偏移等级” |
| 角色网格已经降低,但骨骼动画仍然耗时 | AnimationLodBias |
| 需要完全自定义条件、渐变或滞回 | 项目代码自行管理模型切换;现有配置不能替换内置选择算法 |
常见问题
模型始终不切换
- 确认资源确实生成了多个 LOD,而不只是填写了配置。
- 检查各级屏幕尺寸或切换阈值是否有效且顺序正确。
- 检查相机或模型
LodBias是否设置得过大。 - 检查模型包围盒是否异常大。
模型离相机很近就降级
- 降低对应 LOD 的手动屏幕尺寸。
- 增大模型
LodBias。 - 检查模型比例、节点缩放和包围盒是否正确。
镜头移动时 LOD 来回跳
当前为硬阈值切换。应拉开相邻级别的屏幕尺寸,避免多个阈值过近;特别敏感的重点模型可以保留更少但差异更明确的 LOD 级别。
修改画质偏移后角色没有变化
项目画质的整数 LOD 偏移当前只影响静态模型。骨骼模型应调整资源阈值、相机 LodBias 或模型自身 LodBias。
与 Urho3D 的关系
星火沿用了 Urho3D 的归一化距离、LOD 阈值和 LodBias 心智模型,并在此基础上增加了美术工作台的 LOD 生成与屏幕尺寸配置、项目级画质偏移,以及 GameGraph/WASM API。开发时以本文和当前 SDK 公共 API 为准,不需要依赖原生 Urho3D 的编辑器流程。