简而言之: 一片令人信服的密林是一场性能 boss 战——成千上万棵高多边形树、层叠的透明度,以及一路延伸到地平线的实例。你靠一 条以假身(面向相机的广告牌,从任何角度伪装成 3D 树)收尾的、有纪律的 LOD 链,激进的实例化与剔除,以及几个着色小把戏来让廉价 的远景树不会自我暴露,来赢下它。本文走完从完整网格到广告牌的整条链、八面体假身的把戏,以及如何让一片重度优化的森林不显得死 气沉沉。
这里的每棵树离相机的距离都不同,所以每棵树的成本都该不同。廉价森林的艺术,是只把多边形花在近处的那些身上,其余的都用可信的方 式伪装。
## 核心思路:按距离付费
5 米外的一棵树和 500 米外的一棵树不该花同样的钱。一条 LOD 链在近处花全细节,随距离渐次采用更廉价的表示,最终止于 一块平坦的广告牌——因此总成本在森林增长时保持平坦。
整场游戏就是拒绝为相机几乎解析不到的树支付全价。近处,一棵树是带独立叶片卡的完整网格;远处,它就是一小把像素,一张平坦的图 片就能完美再现。一条 LOD(细节层次)链把这形式化:同一棵树的若干版本,成本递减,按屏幕大小切换。这样,一片一万棵树的森林, 所花的成本大致等于细节可见的那部分,而非把每棵树按全质量加起来。没有它,密度会把你的帧时间线性打入地面;有了它,你能用同 样的预算把树的数量往上推得远得多。
## LOD 链,逐级过一遍
LOD0 带叶片卡的完整网格(近);LOD1–2 削减几何与简化的叶片(中);LOD3 少数几张卡或单张卡;最终 LOD 是一张假身/ 广告牌(远)。每一档大约把成本减半,而切换保持不可见。
一条典型的植被 LOD 链大致跑成这样:LOD0,带所有叶片卡的完整细节网格,用于紧挨着玩家的树;LOD1–LOD2,削减的树干几何 与更少、更大的叶片卡,用于中景;LOD3,一个被极度简化的卡片集合;以及一张最终假身——本质上是一张平坦图片——用于所有远 方。手艺在于过渡距离与融合,好让切换不弹跳。抖动或交叉淡入的 LOD 过渡把切换藏起来;在错误距离上的一次硬弹跳,就是那句打 破幻觉的破绽。按你实际的相机去调这些距离,而不是默认值。
## 假身:从任何角度伪装 3D
一张假身(八面体假身)把树从数十个角度预渲染进一张图集,再把最接近当前视角的那次采集当作广告牌显示。不像一张平坦 的广告牌,它在相机绕行时也看起来对——廉价,但 3D 味十足。
链的远端是最大节省所住之处,而假身就是让它们能被接受的那个聪明把戏。一张朴素的广告牌——一张转向相机的平坦图——正面看还行, 可你一移动它就变平并不自然地滑动。而一张八面体假身是这样解决的:把树从围绕一个球体排布的许多视点做预渲染,把它们打包进 一张纹理图集,然后显示与当前相机方向最接近的那次采集角度(在最近的几张之间融合)。结果就是以一小部分成本,从任何角度都读作 一棵真正的 3D 树,这就是为什么假身是可信远景森林的脊梁。它们烘焙一次,绘制时几乎不花钱。
地表层能迅速把实例数放大。下层需要与树同样的纪律:把它实例化、给它 LOD、狠狠剔除它——80 米之外的一株蕨根本不该在绘。
## 实例化与剔除
把重复的树以实例形式绘制,好让几千棵只花几个绘制调用;并激进地剔除——视锥剔除画面外的东西,距离剔除小东西。实例化 修好 CPU 成本;剔除阻止你为不可见的东西付钱。
即便 LOD 完美,把一万棵树作为单独对象提交也会把 CPU 埋掉。实例化把一棵树的所有拷贝坍缩成几次绘制调用,这一点对一片真正的森 林没得商量——而这正是把散布烘焙成引擎原生实例所给你的。除此之外,狠狠剔除:视锥剔除丢掉视野之外的一切,距离剔除移除超出某个 范围就小到看不见的地表杂物与细小植被。特别是草与下层,应当有硬的、近的剔除距离,因为它们把实例数放大得比树还快。一套先绘密 度、再烘焙成实例化网格的工作流——就像 Numivo 那样——正好把一片密林所需的、成批且可剔除的形态交给引擎。
## 让廉价森林活下去
重度优化会让森林看起来静态而无生气——用近处 LOD 上一点点风、实例之间的颜色与比例变化,以及不让远处假身读作平面纸 板的着色去反制它。
这一切效率的风险就是一片跑得飞快却毫无生气的森林。三处便宜的收笔把它拉回来:风——在近处 LOD 上做顶点动画,让近景植被动 起来,即便远处的假身保持静止(没人会注意 300 米外一棵静止不动的树)。变化——按实例随机化比例、旋转与色调,好让眼睛抓不 到重复;一模一样的树是复制粘贴的破绽。以及在假身上的着色用心——把它们的光照烘进去,别在太阳角度改变时被压平成明显的纸 板。把你省下的帧时间花在近景这些细节上,那正是玩家真的会看的地方,这样这片被优化过的森林会和未优化的一样有生命感——而且跑 起来快好几倍。
## 值得偷的现场数字
- 成本原则:按距离付费——远处的树不能像近处的那样花钱
- LOD 链:完整网格 → 削减 → 卡片集合 → 假身,每档大约把成本减半
- 假身 = 图集里预渲染的角度→从任何视角看都 3D 味十足的广告牌
- 把重复的实例化(几次绘制调用)+ 把小的远景植被狠狠剔除
- 让它活着:近处 LOD 的风 + 每实例变化 + 烘好的假身着色
## 迷你问答
广告牌 vs 假身——差在哪? 广告牌是一张面向相机的平坦图,你绕它转动时它会变平。假身存了很多个角度并显示对的那一个,所以 它在 3D 里撑得住。任何玩家会绕着走或从旁走过的东西,都用假身;朴素的广告牌只适合真正遥远、静止的背景板。
一棵树需要多少档 LOD? 通常三到四档再加一张假身。更多并不自动等于更好——每档都有制作与内存成本。目标是让每次切换都是一 小步、不被察觉,而不是一个上限。
Nanite 是否让这些过时? 它改变了几何这一侧——Nanite 处理密集的网格细节而无需传统 LOD——但透明度(叶片卡)、实例化纪律与 剔除仍然要紧,假身在远景仍有用武之地。原则活下来了;工具在挪位。
最常杀掉森林性能的是什么? 相互重叠的透明叶片卡带来的过绘制,以及未剔除的地表植被。收紧叶片卡、把下层近处剔除掉、把一 切都实例化——这三样在你还没碰到树的网格之前,就能把预算大头夺回来。
一片密林是最惩罚性的渲染对象之一,也是把它做对最有回报的对象之一。建好 LOD 链,让假身扛下远景,无情地实例化并剔除,把节省 出来的花在近处的风与变化上——你就会拥有一片一路延伸到地平线且守得住帧率的森林。

