Foliage 与植被
自动关联目录:Foliage 与植被
相关官方依据:Nanite(Nanite Foliage、Foliage 使用 WPO 的说明)、虚拟阴影贴图(Deformation and Foliage 一节)、World Partition 转换的
-FoliageTypePath参数。
1. 定位
植被是开放世界里"数量最多、也最容易把性能打穿"的一类内容:草、灌木、树,动辄几十万实例。
一句话定位:植被的三个成本分别在绘制(实例数)、阴影(VSM 缓存作废)、时域(TSR/WPO)。只优化其中一项通常不够。
2. 三个成本
① 绘制
| 机制 | 说明 |
|---|---|
| 实例化 | Foliage 用 HISM(层级实例化静态网格)承载 |
| Nanite Foliage | 官方的 Nanite 植被方案:用实例化 + 蒙皮 + 体素化 + 动画 + 材质特性组合,实现大规模高密度植被,成本远低于传统方式 |
| 剔除距离 | 每种 Foliage Type 可设剔除距离 |
| LOD | 必须有完整 LOD 层级(见 静态网格与 LOD) |
② 阴影(最容易被忽略)
已核实(VSM 的 Deformation and Foliage 一节):
使用 WPO(世界位置偏移)、PDO 或骨骼动画的几何会每帧作废缓存页。草和植被尤其典型。
官方给出的缓解手段:
| 手段 | 说明 |
|---|---|
| 远处改用 Contact Shadows | 对草/部分植被,Contact Shadow 足以替代高分辨率阴影贴图 |
r.Shadow.RadiusThreshold | 非 Nanite 物体的 CPU 剔除阈值,控制远处小物体的阴影成本 |
| 按距离关闭形变 | 用 Mesh LOD 在远处切换到不使用 WPO/PDO 的材质;更远处可直接关掉动态投影 |
| Distance Field Shadows | 方向光在 Dynamic Shadow Distance Movable Light 之外接管非 Nanite 几何(含植被) |
| 大型投影体用 Nanite | Nanite 遮挡住的作废可以跳过,非 Nanite 不行 |
③ 时域
- 植被的 WPO 动画没有运动向量,会让 TSR 的表现不稳定
- 官方在 Nanite 篇提到:植被用 WPO 问题较小,因为植被本身有孔洞、不会自遮挡
3. 与 Nanite 的关系(已核实)
| 项 | 说明 |
|---|---|
| Nanite Foliage | 官方的一套集成系统,用于大规模高密度植被,成本远低于传统方式 |
| 组件支持 | Nanite 网格可用于 Foliage Painter 与 Landscape Grass |
| 形变限制 | Nanite 不支持 Morph Target;WPO 支持但受限(会被切成更小的簇独立剔除,必须 clamp 位移量) |
| 建议 | 官方明确:Nanite 网格渲染进 VSM 效率高得多,理想状态下只有 Nanite 不支持的才用非 Nanite |
4. 参数与设置
| 设置 / CVar | 作用 |
|---|---|
| Foliage Type 的剔除距离 | 控制绘制距离 |
r.Shadow.RadiusThreshold | 非 Nanite 的 CPU 剔除(阴影) |
r.Shadow.Virtual.* | VSM 相关(见 VSM 篇) |
| World Position Offset Disable Distance | primitive 属性:超过该距离不再应用 WPO |
| Shadow Cache Invalidation Behavior | 逐 primitive:Auto / Always / Rigid(抑制 WPO 引起的作废)/ Static |
| Displacement Fading(材质) | 材质侧淡出位移 |
-FoliageTypePath=[Path](WP 转换) | 关卡里嵌了 Foliage Type 时导出成资产 |
5. 代价与权衡
| 设计 | 收益 | 代价 | 什么时候不该用 |
|---|---|---|---|
| 高密度植被 | 画面丰富 | 绘制 + 阴影 + 时域三重成本 | 性能预算不足时必须降密度 |
| WPO 风动 | 生动 | 每帧作废 VSM 缓存页、TSR 不稳 | 远处必须关闭 |
| Nanite Foliage | 大规模高密度可行 | 平台限制(SM6/DX12) | 移动端不可用 |
| Contact Shadow 替代 | 极省阴影 | 质量低(只有接触阴影) | 近处需要真实投影 |
| 远处关动态投影 | 省 | 远景没有投影 | 大片植被的远景可接受 |
6. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 铺了植被后帧率崩 | 三重成本叠加 | 分别关绘制/阴影/WPO 对比 |
| 阴影极慢 | WPO 每帧作废 VSM 缓存 | VSM 的 Cached Page 可视化(红一片) |
| 远处植被还在动 | 没按距离关 WPO | 设 World Position Offset Disable Distance |
| TSR 下植被闪烁 | WPO 无运动向量 | 见 TSR 篇;控制 WPO 幅度 |
| 植被消失 | 剔除距离过近 | 调 Foliage Type 设置 |
| 转换 WP 后植被丢了 | Foliage Type 嵌在关卡里 | 用 -FoliageTypePath 导出 |
| 草的阴影很贵 | 大量小实例 | r.Shadow.RadiusThreshold + Contact Shadow |
| 用 Nanite 但 WPO 让物体消失 | 位移没 clamp | 见 Nanite 篇:必须 clamp 位移量 |
7. 排查顺序
1. 帧率崩?→ 先分开测:关阴影 / 关 WPO / 降密度
2. 阴影慢?→ VSM Cached Page 可视化;看是不是植被在每帧作废
3. 时域不稳?→ TSR 篇;控 WPO 幅度
4. 远景?→ Distance Field Shadows / Contact Shadow / 关动态投影
5. 数量?→ 剔除距离 + LOD参考
- Nanite(Nanite Foliage、组件支持、WPO 限制)
- 虚拟阴影贴图(Deformation and Foliage 一节)
- TSR 时域超分 · World Partition · 静态网格与 LOD
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/4692438c.html
更新于:2026年10月10日