UnityGI1:光照烘培

一、全局光照(Global Illumination, GI)系统

全局光照(GI)系统这个概念指的是:既要考虑场景中来自光源的直接光照,又要考虑经光在其他物体表面反射后的间接光照

UnityGI1:光照烘培_第1张图片 光线追踪效果图,可见方块的两侧都映有墙壁的颜色

在光线追踪技术成熟之前,全局光照往往无法应用于实时渲染,因为它的渲染成本实在是太高了,现在确实有不少相关的实时算法,但是这些就不在本次文章的范畴之内了

若考虑到离线,最简单的情况就是:场景在运行时是完全静态的的,光源也是,这时我们就可以提前计算出光照结果并保存到光照贴图中,在游戏运行时直接应用就好,尽管它有以下的局限性:

  • 场景中其它移动的物体(例如玩家)不可反射间接光到其它物体上,反之亦然
  • 无法展现镜面反射,因为这取决于摄像机视角
  • 用于烘焙的光源属性不可改变,也不会拿来在 Shader 中参与计算
  • 光照贴图的体量往往不会小,因为场景一般都比较复杂

可以对上述的情况进行优化,最经典的技术就是光照探针(Light Probes),这些 Unity 当然都支持

二、光照模式

前置:UnityShader17:光照属性与阴影

UnityGI1:光照烘培_第2张图片

留意其中的 Mode 属性,因为这直接决定了光源参不参与烘培

  • Baked:参与烘焙,但是此光源在运行时属性不可改变,无法实时更新、变换、以及打开关闭,也无法参与计算,可以理解为设置了 Baked 的光源仅被用于烘焙,运行时无开销,可以当作不存在
  • Realtime:实时光照,和 Baked 正好相反,它不会参与烘焙,可以配合动态 GI,也可以参与计算以得到更真实的实时阴影等
  • Mixed:最为复杂的一种,可同时照亮静态和动态游戏对象,支持烘培,游戏中也可改变其属性

对于 Mixed Mode,它还拥有以下的额外设置(Windows → Rendering → Lighting → Scene):

这个后面再提,可以默认为 Baked Indirect

2.1 光源资源管理器(Light Explorer)

可以通过 Windows → Rendering → Light Explorer 打开光照资源管理器:它可以统一管理当前激活的光源

UnityGI1:光照烘培_第3张图片

使用面板顶部的四个选项卡可以查看当前场景中的光源(Lights)、反射探针(Reflection Probes)、光照探针(Light Probes)和静态发射(Static Emissives)的设置,可编辑的参数都是每种组件类型最常用的字段

2.2 实时光与混合光

LightMode 设置为 Realtime 就为实时光照,实时光照 = 实时光源 + 实时 GI

实时光照与实时 GI 结合使用的缺点:

  • 由于需要使用额外的一组低分辨率实时光照贴图来存储由 Enlighten 光照系统计算的实时间接反弹光线,因此增加了内存需求
  • 由于需要采样额外的一组实时光照贴图并使用探针来存储由 Enlighten 光照系统计算的实时间接反弹光线,因此增加了着色器计算需求
  • 间接光照会随着时间的推移而收敛,因此属性变化不能太突然

总结:实时光源会为场景提供实时的间接光照以及直接光照,非常适合光源会缓慢变化并且对场景具有很高的视觉影响(例如在天空中移动的太阳,或者在封闭的走廊中缓慢闪烁的光源)的情况,对于快速变化的光源或对于特殊效果,不建议使用,这样实在是太耗了

LightMode 设置为 Mixed 就为混合光照,一般情况下:混合光照 = 实时光源 + 烘焙 GI

三、场景烘焙流程

3.1 Generate Lightmap UVs 设置

通常烘培 Lightmap 需要用到 UV2 通道作为采样 Lightmap 的坐标,如果没有 UV2 则将使用 UV1,但使用 UV1 可能会得到不正确的光照信息

可以选择你需要烘焙的静态物体模型,勾选 Generate Lightmap UVs 选项,这可使得 Unity 生成 Lightmap 所需的 UV2

UnityGI1:光照烘培_第4张图片

3.2 留意光照贴图属性

紧接着可以留意一下 Windows → Rendering → Lighting 中关于光照贴图的设置,暂时只需要关心这几个属性,前三个属性决定着光照贴图的质量

  • Lightmap Resolution:贴图分辨率
  • Direct Samples:直接光采样次数(仅 Progressive)
  • Indirect Samples:间接光采样次数,同上如果采样次数过少,则会出现“花屏”的效果(仅 Progressive),这对于 Unity 自带的球体尤为明显
  • Lightmapper:可切换为启发式(Enlighten)或者渐进式(Progressive),后者以增量方式生成光照贴图,优先考虑场景视图中可见的内容,可以默认为 Enlighten,但需要注意的是,如果你的 Unity 版本在 2021.1 之后,则只能采用渐进式方案
  • Directional Mode:光照贴图模式,可设置为定向(Directional)或者非定向(Non-Directional),若设置为 Directional,光照贴图存储有关光照环境的信息量将多于 Non-Directional,但是这些关于入射光的额外数据可以更好地计算出射光,也就是材质在屏幕上呈现的外观将更加真实,代价就是增加了纹理内存使用量和着色时间

UnityGI1:光照烘培_第5张图片

想要在场景中预览 Lightmap,只需修改场景可视化模式为 Baked Lightmap 即可

UnityGI1:光照烘培_第6张图片

3.3 Lightmap Static 属性

最关键的一步:找到游戏对象的 Mesh Renderer 或 Terrain 相关组件:其中

  • Lightmap Static:告知 Unity 这些游戏对象不会移动和变化,当这个属性启用时,Unity 就会将它们添加到光照贴图中
  • Scale In Lightmap:进一步调整光照贴图的分辨率
  • 光照贴图接缝缝合(Stitch Seams):对于单个游戏物体靠近在一起但彼此分开的网格面,它们会被识别为单独个体,因此对于当前光源环境处理不好的话两个网格之间会出现硬边缘,开启之后 Unity 就会执行额外计算来修改光照贴图,从而改善每个接缝的外观

UnityGI1:光照烘培_第7张图片

对于静态物体,Lightmap Static 默认是被勾选的,不过静态物体在运行时是固定的,位置不可以被移动

3.4 生成光照贴图

完事之后,就可以通过 Windows → Rendering → Lighting → Scene 最下方的 Generate Lighting 生成光照贴图了,也可以勾选旁边的自动,当然这需要花些时间,注意右下角的进度条

成功之后,Unity 就会自动向 Assets 文件夹中添加光照数据、烘焙光照贴图和反射探针等资源,如果你勾选了 Auto Generate 自动生成光照贴图,那么这个文件夹就不可见

UnityGI1:光照烘培_第8张图片

也可以在 Mesh Renderer 或者 Terrain 相关组件找到其对应的 Lightmap,或者是 Windows → Rendering → Lighting 选择 Bakes Lightmaps 找到其对应的网格 UV 图表

UnityGI1:光照烘培_第9张图片

UnityGI1:光照烘培_第10张图片

四、烘焙结果预览

先考虑最简单的情况:只保留平行光并设置其为烘焙光,关闭环境光照,所有的着色器使用内置的 Standard

UnityGI1:光照烘培_第11张图片 非光源地面反射光线到其它物体上面,其它物体表面也呈现了淡淡的绿色

如果一些物体带有自发光,使用光照烘焙当然也可以得到一个非常不错的效果

4.1 小心透明物体

透明物体的烘焙可能会出现错误的结果,这是因为光照烘焙系统并不知道这个物体是透明的

UnityGI1:光照烘培_第12张图片

想要解决这个问题也很简单。先检查 Cast Shadows 属性:

紧接着告诉光照烘焙系统这是透明物体:

  • Asset / Create / Lightmap Parameters 创建光照贴图参数
  • 勾上 IsTansparent 属性
  • 在透明物体的 Mesh 组件上选择对应的 Lightmap Parameters

UnityGI1:光照烘培_第13张图片UnityGI1:光照烘培_第14张图片

将对象标记为透明也会更改它对间接照明的贡献,透明的物体会让间接光通过,而不透明的物体会阻挡它

4.2 启用环境光遮蔽

UnityGI1:光照烘培_第15张图片

  • Max Distance:光线在终止前被跟踪的距离值
  • Indirect:控制 AO 对间接光的影响程度,滑动条值设置得越高,场景的折痕、孔和近表面被间接光照射时的外观就越暗,一般情况下仅将 AO 应用于间接光照
  • Direct:控制 AO 对直射光的影响程度,滑动条值设置得越高,场景的折痕、孔和近表面被直射光照射时的外观就越暗

UnityGI1:光照烘培_第16张图片

参考文章:

  • 深入了解Unity的光照贴图(一) - 知乎
  • 全局光照 - Unity 手册
  • Light Inspector - Unity 手册
  • Unity移动平台下的烘焙使用及优化_shengtianzhu的博客-CSDN博客
  • Lightmap 烘培注意事项_Kenight_的博客-CSDN博客
  • Rendering 16

你可能感兴趣的:(#,Unity3D,全局光照,Unity3D)