4、光照系统入门:光源类型、光照设置与阴影、光照贴图基础

光照,说白了就是游戏的灵魂。没有光,再精美的模型也只是一堆灰扑扑的多边形。我刚开始做游戏那会儿,总觉得光照嘛,随便打几个灯就行了。结果项目一跑,场景要么亮得像医院手术室,要么暗得连路都看不清。嗯,后来我才明白——光照不是「照亮」,而是「塑造」。

今天咱们就来聊聊光照系统的三个核心:光源类型阴影与光照设置、以及光照贴图。这些都是我每天在项目里打交道的东西,希望能帮你少走点弯路。

4.1 光源类型:三种基本光源

在Unity或Unreal里,光源类型其实就三种:方向光、点光源、聚光灯。每种都有它的脾气。

4.1.1 方向光(Directional Light)

方向光模拟的是太阳。它没有具体位置,只有方向。你想想看,太阳离我们那么远,光线几乎是平行的,所以方向光照射到场景里,所有物体的受光角度都一样。

特点:

  • 没有衰减,距离不影响亮度
  • 覆盖整个场景,适合做主光源
  • 阴影计算开销相对较小

我在项目中遇到过一个问题:方向光的旋转角度稍微偏一点,整个场景的氛围就变了。比如你想做黄昏效果,把方向光压低到接近地平线,阴影会拉得很长,很有电影感。但如果你不小心把光朝上打,场景就会变得阴间——嗯,真的,我试过。

重要提示:方向光的位置不影响光照效果,只有旋转角度有意义。所以别傻乎乎地拖拽它的位置,没用。

4.1.2 点光源(Point Light)

点光源像灯泡,从一个点向四面八方发光。它有位置,有范围,有衰减。

关键参数:

  • Range(范围):光能照多远
  • Intensity(强度):亮度
  • Color(颜色):光的颜色
  • Falloff(衰减):光随距离变暗的速度

我个人习惯把点光源的衰减曲线调成「平方反比」,这样更接近真实物理。但如果你追求性能,可以用线性衰减,计算量小一些。

小技巧:点光源不要放太多。每个点光源都会增加渲染开销。我见过有人在一个房间里放了20个点光源,结果帧率直接掉到15帧。后来我建议他用光照贴图替代,问题就解决了。

4.1.3 聚光灯(Spot Light)

聚光灯像手电筒,光从一点发出,呈锥形照射。它有方向、有角度、有衰减。

参数:

  • Spot Angle(聚光角度):锥形的大小,通常0-180度
  • Inner/Outer Angle(内外角):内角是强光区域,外角是过渡区域
  • Range(范围):照射距离

聚光灯很适合做舞台效果、手电筒、或者建筑里的射灯。我记得有一次做恐怖游戏,主角拿着手电筒在黑暗里探索,聚光灯的锥形边缘稍微加了一点模糊,效果特别真实。玩家反馈说「手电筒的光像真的一样」。

注意:聚光灯的阴影计算比方向光贵得多。如果你有多个聚光灯同时投射阴影,性能会爆炸。我曾经在一个场景里放了6个聚光灯,结果编辑器直接卡死。后来我把其中4个改成不投射阴影,只做照明,问题就解决了。

4.2 光照设置与阴影

光照设置不只是调亮度。阴影才是让场景「立起来」的关键。

4.2.1 阴影类型

主流引擎支持三种阴影:

阴影类型 性能开销 质量 适用场景
硬阴影(Hard Shadow) 边缘锐利 卡通风格、低配设备
软阴影(Soft Shadow) 边缘模糊 写实风格、PC/主机
接触硬化阴影(Contact Hardening) 近处硬、远处软 AAA级画质

我个人建议:移动端用硬阴影,PC端用软阴影。接触硬化阴影虽然好看,但开销太大,除非你项目不差性能。

4.2.2 阴影设置的关键参数

  • Shadow Resolution(阴影分辨率):越高越清晰,但越耗显存。我一般用1024或2048,512太糊,4096太贵。
  • Shadow Distance(阴影距离):超过这个距离的物体不投射阴影。我习惯设成30-50米,远了你也看不清。
  • Shadow Cascades(阴影级联):把阴影分成近中远三层,近处精细远处粗糙。这个技术很实用,能大幅提升近处阴影质量。
避坑指南:我曾经在做一个开放世界项目时,把Shadow Distance设成了200米,结果每帧都要计算几百个物体的阴影,帧率直接崩了。后来我把距离砍到50米,配合阴影级联,效果几乎没差别,性能却翻了一倍。

4.3 光照贴图基础

光照贴图(Lightmap)是预烘焙的光照信息。说白了,就是把光照「画」到模型上,运行时不用实时计算。

4.3.1 什么时候用光照贴图?

  • 静态物体(墙壁、地面、建筑)
  • 不需要动态阴影的场景
  • 移动端或低配设备
  • 需要高质量间接光照

我做过一个室内场景,全是静态物体。如果用实时光照,每个点光源都要计算阴影,性能根本扛不住。后来我全部烘焙成光照贴图,帧率从30帧直接飙到60帧。嗯,这就是光照贴图的威力。

4.3.2 光照贴图的工作流程

  1. 标记物体为静态:在Inspector里勾选「Static」或「Lightmap Static」
  2. 设置光照参数:调整光源强度、颜色、阴影类型
  3. 调整UV:光照贴图需要第二套UV,不能和纹理UV重叠
  4. 烘焙:点击Bake,等待引擎计算
  5. 检查结果:看有没有漏光、接缝、噪点
小技巧:烘焙前一定要检查模型的UV2。如果UV2有重叠,光照贴图就会出现奇怪的条纹。我习惯在建模软件里手动展UV2,保证每个面都有足够的空间。

4.3.3 光照贴图的参数

参数 作用 建议值
Texel Size(纹素大小) 每个像素对应多少世界单位 0.1-0.5(根据场景大小)
Max Lightmap Size 单张贴图最大分辨率 1024或2048
Padding(间距) 不同物体之间的间隔 2-4像素
Bounces(反弹次数) 间接光照的反弹次数 2-3次(多了效果提升不大)

我个人习惯把Texel Size设成0.2,这样近处细节够用,远处也不浪费。Bounces设成2次就够了,3次以上效果提升微乎其微,但烘焙时间翻倍。

注意:光照贴图是静态的。如果场景里有动态物体(比如移动的NPC、可开关的灯),它们不会受到光照贴图的影响。这时候你需要混合使用实时光照和光照贴图。我一般把动态物体单独用实时点光源照亮,静态部分用光照贴图。

4.4 总结与建议

好了,咱们来捋一捋今天的内容:

  • 方向光:做太阳,调角度就行
  • 点光源:做灯泡,注意数量和衰减
  • 聚光灯:做手电筒,阴影开销大
  • 阴影:硬阴影省性能,软阴影好看,级联是神器
  • 光照贴图:静态物体的救星,性能翻倍的关键

最后说一句:光照这东西,理论再多也不如动手调。你打开引擎,放一个方向光,调调角度,看看阴影的变化。再放一个点光源,调调衰减。嗯,亲手试过,你才能真正理解。

下一章咱们聊材质系统,到时候我会讲讲怎么用材质让光照「活」起来。敬请期待。