彻底弄懂Unity3D的光照模式,光照贴图和光探针(持续更新)

1 光源的Light Mode

光源的Light Mode分为RealtimeBakedMixed四种。

Realtime类型

  1. 本类型的光源,会根据Shadow Distance项指定的值,以及当前摄像机的位置值,去敲定本光源是否给物体投下阴影。在URP中,Shadow Distance值在Universl Render Pipeline Asset中指定。
  2. 在旧管线中,如果启用了【Realtime Global Illumination】选项,realtime光源仅贡献实时的直接光照部分。正因为如此,所以由这种光源产生的影子是纯黑的,不会受别的间接光照的影响
  3. 在自定义的管线中,实时光源可以对实时的间接光照部分产生贡献。

Baked类型

  1. Unity把Baked类型的光源产生的照明和阴影信息,烘焙到lightmap或者light probe中。
  2. baked类型的光源,只贡献了漫反射部分的光照,不贡献镜面高光部分的光照。
  3. 只有标识为static的GameObject才接受baked类型的光源产生的照明和阴影。

Mixed类型

  1. mixed类型,顾名思义,即是整合了realtime和baked两种模式的特点。采用mixed类型的光源,可以在其贡献的直接光照部分,使用realtime的模式实现,间接光照部分,使用baked模式实现。
  2. 在场景中,mixed类型的光源的行为,依赖于【Lighting】窗口中的【Lighting Mode】属性设置。不同的设置,会产生不同的视觉保真度,以及产生不同的性能消耗。
  3. 在运行时,可以更改mixed类型的光源的属性。但仅对realtime部分的属性生效。

2【Lighting】窗口中的【Lighting Mode】属性

直接光照的实现模式 间接光照的实现模式 阴影的实现模式 适用机型
Baked Indirect real-time baked real-time 中端机型
Shadowmask real-time baked 部分baked,部分real-time 中高端机型
Subtractive baked baked 只对一个平行光渲染real-time阴影 低端机型

Baked Indirect光照模式的一些细节

内置管线,URP,HDRP,都支持本模式

在本模式下,Mixed类型的光源照射到GameObject时,GameObject会收到以下的光影信息如下表:

Shadowmask光照模式的一些细节

与baked indirect模式类似,Shadowmask模式也结合了实时直接光照和烘焙间接光照。但两者不同之处在于在于渲染阴影的方式。Shadowmask模式允许Unity在运行时结合baked阴影和real-time阴影,并在远处渲染阴影。它通过使用额外的光照贴图 纹理称为阴影蒙版,并通过将附加信息存储在光探头。

Shadowmask模式提供所有模式下保真度最高的阴影,但性能成本和内存要求最高。

不同渲染管线对Shadowmask模式的支持程度

管线类型 是否支持
内置管线 支持
URP 从10.1版本开始支持
HDRP 支持

Shadowmask模式有两种,一种是Distance Shadowmask,另一种是Shadowmask。在Project Setting界面的Quality选项可以指定,如下图所示:

Shadowmask的实现细节

采用shadowmask模式对场景进行烘焙时,会生成与光照图在同一目录下的,导入纹理格式为shadowmask的,以_shadowmask为后缀的shadowmask纹理贴图。

在运行时,Unity 使用shadowmask纹理贴图来确定某个像素是否在阴影中。shadowmask纹理贴图包含有关烘焙光源的遮挡信息。shadowmask纹理贴图与相应的光照图共享相同的 UV 布局和分辨率。还针对每个纹素包含最多四个光源的遮挡信息(以 RGBA 格式存储,故而可以看到在win,android,ios平台上)。

如果超过四个光源发生重叠,即有多于4个光源对当前像素贡献了光影,多余光源会回退(fall back)至Baked模式来执行烘焙。烘焙系统会决定哪个光源回退至烘焙光照,并在各烘焙之间保持一致,除非您修改其中某个重叠的光源。光照探针也会接收最多四个光源的相同信息。

Unity处理光源重叠(light overlapping)的方式,是不依赖于接受阴影的GameObject(shadow receiving objects)。因此,一个GameObject可受到全部来自同一个Shadowmask/Probe的十个不同混合光源的影响,只要这些光照包围体在空间中的任何点都不重叠即可。如果某些光源重叠,则 Unity 会使用更多通道。如果某个光源确实发生重叠而所有四个通道都在使用中,则该光源将回退至完全烘焙。

Subtractive光照模式的一些细节

在此模式下,所有的mixed类型的灯,其直接照明和间接照明都以baked形式提供。Unity把静态GameObject投下的影子,也烘焙进光照贴图中。而唯一的一个主平行光,则以real-time的模式,给动态GameObject产生影子。

因为此模式下阴影是烘焙进光照图内的,所以Unity没有足够的数据信息支持在运行时混合baked和real-time的阴影。所以在此模式下,Unity提供了一个Realtime Shadow Color参数,用来混合baked和real-time的阴影, 以减弱光照图贴图中的阴影效果,

不同渲染管线对Subtractive模式的支持程度

管线类型 是否支持
内置管线 Yes
URP Yes
HDRP Yes

改变阴影颜色

当使用本模式时,Unity 会在【Lighting】窗口中显示Realtime Shadow Color实时阴影颜色属性。当 Unity 将real-time阴影与baked阴影相结合时,它会使用此颜色。更改此值以近似场景中间接照明的颜色,以更好地匹配实时阴影与烘焙阴影。

四种不同的光照模式下GameObject所接受的光影信息

3 Lighting界面中的Progreesive Update选项的详细解析:

当勾选上【Progressive Update】这一项时,在编辑阶段,在当前镜头下看到的场景某一部分时,假定这一部分覆盖了多张光照图,Unity会优先烘焙这多张光照图(所覆盖到场景的那部分)。而如果不勾选的话,就只能完全烘焙完一张,再接着其他张。勾选此项,可以一边编辑一边看光线烘焙的效果对不对。而不用等到全部都烘焙再看效果。这一部分的内容细节可参照如下引用

Lightmap Baking:Progressive GPU源码分析 相机裁剪就是从相机出发,发射ray到lightmap所有texel所在的世界坐标,如果该ray能够打到texel的世界坐标,没有被遮挡或发射到相机视锥之外,则说明该texel位于相机视野内,能够被观察到。

相机裁剪主要是为了满足Unity的Prioritize View的实现,在开启这个功能的情况下,Unity会优先bake位于相机视野内的lightmap的texel,这些texel称为visible texel,只有等到这些texel都converge之后,才会去bake其他texel。这也是Unity称其为Progressive方法的重要原因。

当开启Prioritize View的时候,尽管相机视野内的texel隶属于不同的lightmap,但会在一次pass中逐lightmap进行bake,所有相机可见的texel在一次pass中都会被计算。

开启Prioritize View,视野内texel优先渲染

快速切换镜头,其他texel实际上没有开始计算

而如果关闭Prioritize View,则Unity会把lightmap一张一张地bake,只有第一张lightmap完全converge之后,才会去bake第二张lightmap,这里可能是考虑了内存和显存的占用问题。

关闭Prioritize View,按照lightmap顺序渲染

光照图中的Directional Mode