92.光照烘焙

92.性能优化-GPU-着色器优化-降低填充率压力-光照烘焙


92.1 知识点

搭建测试场景

搭建测试场景:添加几个 Cube 和三个不同颜色的点光源,并让白色光源动起来。

挂载移动脚本:

using UnityEngine;

public class Lesson92_MoveLightY : MonoBehaviour
{
    private void Update()
    {
        this.transform.position += Vector3.up * Mathf.Sin(Time.time) * 0.003f;
    }
}

什么是光照烘焙

提前离线计算场景中的光照、阴影、反射、间接光照等信息,将结果保存为贴图或探针数据,运行时直接使用,从而节省实时计算的性能消耗。

  • 实时光照:每帧都需要计算,开销很大。
  • 烘焙光照:提前算好,运行时直接采样光照纹理,几乎零性能开销。

简单来说:把光照表现提前算好存进纹理,运行时直接取出用于着色,避免实时计算的高开销。这是典型的内存换性能的优化方式。

哪些光照信息可以被烘焙

可烘焙:

  1. 直接光照:光源直接照射到表面的光。
  2. 间接光照:光线在场景中多次反射后的柔和照明。
  3. 阴影:可烘焙静态阴影(不会随动态物体移动)。
  4. 反射:通过反射探针(Reflection Probe)烘焙环境反射。

不可烘焙:

  • 随时间变化的灯光或移动的光源。

如何进行光照烘焙

总体思路

  1. 将想要参与烘焙的静态物体标记为 Static,或只勾选 Contribute Global Illumination(参与全局光照)。只有勾选该选项的物体才会被当作静态对象进行烘焙。动态对象需要使用光照探针,不能作为静态对象处理。
  2. 设置灯光模式。
  3. 打开 Lighting 设置窗口,进行光照烘焙设置。

标记静态物体

把平面和 Cube 勾选 Contribute GI,或直接勾选 Static

设置灯光模式

  • Realtime(实时):每帧实时计算光照,用于动态灯光(手电筒、闪烁灯等)。
  • Baked(烘焙):只在烘焙阶段起作用,用于完全静态的灯光。
  • Mixed(混合):同时支持烘焙与实时,常用于主光源(如太阳光)。

建议: 太阳光(主光源)用 Mixed;室内灯光(蜡烛、台灯等)用 Baked;特效等(会移动或变化的光源)用 Realtime。

全局光改成 Mixed:

红黄光改成 Baked:

白光保持 Realtime:

打开 Lighting 设置窗口

通过 Window → Rendering → Lighting 打开。

可以点击 New 创建光照设置文件。

光照设置面板详细参数

Realtime Lighting(实时光照)

  • Realtime Global Illumination:实时全局光照开关。
  • Realtime Environment Lighting:实时环境光。
  • Indirect Resolution:实时光照的间接光分辨率,仅在 Realtime GI 开启时有效。

建议: 一般关闭此项,仅使用 Baked GI(性能更好、质量更稳定)。

Mixed Lighting(混合光照)
  • Baked Global Illumination:必须勾选才能烘焙静态光照。
  • Lighting Mode(混合光照计算模式)

Shadowmask(阴影遮罩模式): 最常用。结合烘焙静态光源的间接光照 + 实时光的动态阴影。静态对象的阴影由烘焙贴图提供,动态物体的阴影由实时计算。较平衡,适合主机/PC,典型用于混合场景(静态建筑 + 动态角色)。

Subtractive(减法模式): 最简化,面向低端移动平台。只允许一个主方向光提供实时阴影,其余光照全部烘焙。性能最佳,适合卡通风、移动端、光照简单的关卡。

Baked Indirect(间接烘焙模式): 只烘焙间接光照(GI),直接光照和阴影实时计算。开销较高,适合室外场景、昼夜循环、动态光源多的场景。

使用建议: Shadowmask 兼顾质量与性能;Subtractive 面向移动端;Baked Indirect 追求真实实时光照效果。

Lightmapping Settings(光照贴图设置)
  • Lightmapper(烘焙引擎):Progressive GPU(更快,需显卡支持)或 Progressive CPU;一般用 Progressive GPU。

  • Importance Sampling:改进采样精度,提高高亮区域的采样密度;建议开启。
  • 采样设置:
    • Direct Samples:每个像素的直接光采样次数,控制阴影锐利度;常用 32–128。
    • Indirect Samples:间接光采样次数,越高越平滑但耗时更长;建议 256–512。
    • Environment Samples:环境光(天空盒)采样次数,影响环境光平滑度;默认 256。
    • Light Probe Sample Multiplier:光照探针采样倍数;默认 4。
  • Max Bounces:光线最大反射次数;2–3 次通常足够。
  • Filtering(滤波):None 关闭 / Auto 自动(推荐)/ Advanced 高级(可能颗粒感强)。

  • 分辨率相关:

    • Lightmap Resolution:每单位世界空间使用多少像素;室内小场景 40–60,室外大场景 10–20。
    • Lightmap Padding:贴图中不同物体间的像素间隔;2–4 texel 即可。
    • Max Lightmap Size:单张 Lightmap 最大分辨率;1024–2048 视情况而定。
    • Fixed Lightmap Size:固定 Lightmap 尺寸;一般关闭。
    • Use Mipmap Limits:是否使用 Mipmap 限制以节省内存;一般开启。
  • Lightmap Compression(光照贴图压缩):None / Low / Normal / High;选高质量可减少块状伪影。

  • Ambient Occlusion(环境遮蔽):模拟角落、缝隙处的局部阴影,增加立体感;建议开启。AO 不产生方向性阴影(不随光源方向变化),只让遮蔽区域更暗。

  • Max Distance:AO 最大作用距离,值越大扩散越广但可能显脏;一般 0.5–2。
  • Indirect Contribution:AO 对间接光的抑制强度;一般 0.5–1。
  • Direct Contribution:AO 对直接光的影响;一般 0.1–0.5。

参考设置:

场景类型 Max Distance Indirect Direct
室内高对比 1 1 0.3
室外自然光 2 0.5 0.2
卡通/简洁风 0.5 0.8 0.1
  • Directional Mode:是否存储光照方向信息;有法线贴图的场景用 Directional(推荐)。

  • Albedo Boost:增强表面颜色反射强度;一般保持 1。
  • Indirect Intensity:间接光照亮度倍数;常用范围 1–2。
  • Lightmap Parameters:控制光照贴图细节的模板(Default-Low / Medium / High);一般用 Default-Medium 或 Default-High。
其他设置
  • GPU Baking Profile:使用哪个 GPU 配置进行烘焙;默认 Automatic 即可。
  • Bake On Scene Load:Never(不自动烘焙)或 If Missing Lighting Data(缺失时自动烘焙)。

  • Generate Lighting:手动开始光照烘焙,点击此按钮即可。

调优建议: 噪点多时提高 Samples;边缘发黑时增大 Lightmap Padding;太亮或太暗时调整 Indirect Intensity。

执行烘焙

点击 Generate Lighting,看到生成的数据文件以及纹理说明烘焙成功。

如何判断是否成功使用了光照贴图

  1. 查看 Window → Rendering → Lighting → Baked Lightmaps 中是否存在已生成的光照贴图。

  1. 在 Scene 视图中通过选择观察模式来查看光照贴图显示部分。

  1. 查看场景中物体的 Renderer 组件的 Lighting 区域:确认对象是否勾选了参与烘焙的选项,并查看 Lightmapping 部分是否关联了烘焙的光照贴图。

  1. 检查灯光模式是否使用了 Baked 或 Mixed。

隐藏红黄灯后仍能看到红黄色光照效果,说明这部分是光照烘焙的结果。关闭白光后白色消失,因为白光是实时的。

创建一个球体,会发现它不受红黄烘焙光影响,但能受到白色实时光影响。要解决动态物体无法接收烘焙光照的问题,需要使用光照探针反射探针


92.2 知识点代码

Lesson92_性能优化_GPU_着色器优化_降低填充率压力_光照烘焙.cs

public class Lesson92_性能优化_GPU_着色器优化_降低填充率压力_光照烘焙
{
    #region 准备工作

    // 搭建测试场景:Cube + 三个不同颜色的点光源,白光挂脚本使其移动。

    #endregion

    #region 知识点一 什么是光照烘焙

    // 提前离线计算光照、阴影、反射、间接光照等信息,保存为贴图或探针数据,
    // 运行时直接使用,避免实时计算的高开销。典型的内存换性能优化方式。

    #endregion

    #region 知识点二 哪些光照信息可以被烘焙

    // 可烘焙:直接光照、间接光照、静态阴影、反射(Reflection Probe)。
    // 不可烘焙:随时间变化的灯光或移动的光源。

    #endregion

    #region 知识点三 如何进行光照烘焙

    // 1. 静态物体标记 Static 或勾选 Contribute Global Illumination。
    // 2. 设置灯光模式:主光源 Mixed,静态灯 Baked,动态灯 Realtime。
    // 3. 打开 Lighting 窗口,配置参数后点击 Generate Lighting。

    #endregion

    #region 知识点四 如何判断是否成功使用了光照贴图

    // 1. Lighting → Baked Lightmaps 中查看已生成的光照贴图。
    // 2. Scene 视图切换 Baked Lightmap 可视化模式。
    // 3. Renderer 组件 Lighting 区域查看 Contribute GI 与 Lightmapping 信息。
    // 4. 检查灯光模式是否为 Baked 或 Mixed。

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏