4、间接光照:Lightmass全局光照、Lightmap烘焙原理

好,咱们来聊聊间接光照。说实话,很多刚入行的朋友觉得直接光照搞定了,画面就差不多了。但你看那些真正惊艳的场景,那种“光感”和“氛围”,其实都是间接光照在撑场面。没有它,画面就是平的、假的。

在Unreal里,处理间接光照的主力就是Lightmass。它是个离线烘焙工具,说白了,就是提前算好光怎么反弹,然后把结果存到Lightmap里。运行时直接读取,不消耗性能。嗯,这里要注意,Lightmass不是实时的,它需要你手动或者自动触发烘焙。

Lightmass的工作原理

Lightmass的核心思想是光子映射。它从光源发射出大量光子,让这些光子在整个场景里弹来弹去。每次碰到表面,就记录下位置和能量。最后,根据这些光子分布,计算出每个点的间接光照强度。

我个人习惯把Lightmass的流程拆成三步:

  1. 光子发射:从光源发射光子,模拟光线传播。
  2. 光子收集:在场景中采样点收集附近的光子信息。
  3. 最终汇聚:结合直接光照和间接光照,生成最终的Lightmap。

我在项目中遇到过一个问题:场景里有个小窗户,外面是强太阳光。结果烘焙出来,室内一片死黑。为什么?因为光子数量不够,穿过窗户的光子太少,没法照亮室内。后来我把光子数量翻了三倍,效果才正常。

关键参数:

  • Num Indirect Lighting Bounces:间接光照反弹次数。默认3次,室内场景建议4-5次。
  • Num Sky Lighting Bounces:天空光照反弹次数。室外场景这个参数影响很大。
  • Indirect Lighting Quality:质量预设。Production级别最稳,但慢。

Lightmap烘焙原理

Lightmap说白了就是一张纹理。它记录了场景中每个点的光照信息。烘焙时,Lightmass会为每个静态物体生成UV,然后把光照结果画到这张纹理上。

你想想看,运行时引擎只需要采样这张纹理,就能得到光照颜色。完全不需要实时计算光线追踪,性能开销极低。这也是为什么很多手游和主机游戏还在用Lightmap的原因。

Lightmap的精度直接决定了光照细节。精度越高,光影边缘越锐利。但代价是纹理内存和烘焙时间。

Lightmap分辨率 适用场景 内存占用(单物体)
32x32 小物件、远处物体 4KB
128x128 中等大小物体 64KB
512x512 主要建筑、地面 1MB
1024x1024 重要角色、特写物体 4MB

我曾经犯过一个错误:给一个巨大的地面用了1024x1024的Lightmap。结果烘焙出来,地面上的光影细节确实好,但整个场景的Lightmap内存直接爆了。后来我改成512x512,配合适当的UV布局,效果几乎没差别,内存却省了一大半。

我的建议:

不要盲目追求高分辨率。先看物体在画面中的占比。一个远处的柱子,用64x64就够了。主角脚下的地面,才值得用512x512。

Lightmap UV的坑

嗯,这里要重点说一下。Lightmap需要独立的UV通道(UV Channel 1)。这个UV不能有重叠,不能有拉伸,而且要充分利用纹理空间。

我见过太多人直接把贴图UV拿来当Lightmap UV用。结果呢?重叠的UV导致光照信息互相覆盖,烘焙出来全是奇怪的条纹和色块。

正确的做法是:在建模软件里,为物体生成一套专用的Lightmap UV。这套UV要满足:

  • 所有UV岛不重叠
  • UV岛之间留2-4个像素的间距(Padding)
  • UV岛尽量方正,避免拉伸
  • 充分利用0-1空间,不要浪费

避坑指南:

我曾经接手过一个项目,场景里有个复杂的机械模型。美术偷懒,没做Lightmap UV。结果烘焙出来,机械臂上的光影全是乱的。我花了整整两天,手动在Maya里重新展UV。从那以后,我要求所有静态模型必须提供独立的Lightmap UV,否则不接收。

烘焙质量的平衡

Lightmass烘焙是个吃时间的过程。一个中等规模的场景,Production质量可能要跑几个小时。但Preview质量几分钟就搞定。

我个人的工作流是这样的:

  1. 先用Preview质量快速迭代,看光照布局对不对。
  2. 布局确定后,用Medium质量检查细节。
  3. 最终输出时,才用Production质量。

这样能节省大量时间。你想想看,如果每次调整灯光都跑Production,一天也调不了几次。

另外,Static Lighting Level Scale这个参数也很关键。它控制着Lightmap的全局分辨率。数值越小,分辨率越高。默认是1,室内场景建议调到0.5或0.25。但注意,这个参数会影响所有物体,调低后内存会暴涨。

间接光照的常见问题

最后,我总结几个实战中经常遇到的问题:

  • 漏光:场景中有缝隙,光线从缝隙漏进来。解决办法是检查模型密封性,或者调整Lightmass的Filtering参数。
  • 噪点:Lightmap上有颗粒感。通常是光子数量不够,或者采样质量太低。提高Num Indirect Lighting Samples可以缓解。
  • 色溢:红色墙壁把红色反射到白色天花板上。这是物理正确的,但有时候看起来脏。可以降低Diffuse Boost参数,或者手动调整材质颜色。

说白了,Lightmass和Lightmap这套方案,虽然老,但非常成熟和稳定。只要掌握了原理和参数,你就能烘焙出电影级的光照效果。而且,它不依赖硬件光追,兼容性极好。嗯,这就是为什么直到今天,很多3A大作依然在用这套技术。