混合光照

原文链接:混合光照

混合光是指在光照组件中将模式设置为Mixed
混合光可以在运行过程改变位置和视觉属性(颜色和亮度),但是有很强的限制。它们能照射静态和动态的GameObject,能够提供直接光照,也能可选地提供间接光照。混合光照亮的动态GameObject能向其它动态GameObject投射动态阴影。
场景中所有的混合光使用相同的Mixed Lighting Mode。在光照窗口中,选择场景标签,在Mixed Lighting部分可以设置混合光模式。
alt text
光照窗口的混合光部分
可用的模式包括:
- Baked Indirect
- Shadowmask
- Subtractive

使用混和光

混合光可以用来表示照亮静态环境,在游戏中不变化的光照(比如天空中不移动的太阳)。混合光发出的直接光仍然会在运行时计算,静态mesh的材质能够保持视觉真实度,包括完整的physically based shading (PBS)支持。
alt text
一个混合光的例子
Shadowmask模式的Distance Shadowmask是最消耗资源的选项,但是提供最好的效果。在Shadow Distance设置的距离范围内产生高质量的阴影,并且烘培高质量的阴影。比如说,只要太阳不在天空中移动,就可以创建直到地平线的带有真实阴影效果的巨大景观。
Subtractive模式的效果最差:它在运行时只为一个光照生成实时阴影,并将它们和烘培的直接光照和间接光照组合起来。这种模式只作为其它模式不可用时的备用方案(比如要在一个低端移动设备上运行程序,但是内存空间不足以使用ShadowmaskDistance Shadowmask)。
不同模式的简单比较请参考Unity Lighting Modes Reference Card
所有的混合光模式在所有平台都被支持,但是有些渲染限制:

高级用法

混合光能在运行时改变它们的位置和视觉属性(颜色和亮度),但是有很强的限制条件。实际上有些光照在预处理过程中进行了烘培,在运行时改变任何参数都会导致实时光照和预处理光照合成后的结果不一致。
对于Baked IndirectShadowmask,它们的直接光照部分和Realtime光照的工作方式是一样的,所以可以改变光照的颜色和亮度,甚至可以改变位置。但是烘培的部分是预处理的,不会在运行时发生改变。
比如将一个红色混合光烘培到了lightmap,在运行时将颜色改编为绿色,所有的直接光会变成绿色。但是所有烘培到lightmap的间接光仍然是红色的。这个效果对在运行时移动混合光一样成立。直接光会跟随光照移动,但是间接光仍然留在光照烘培时的位置。
如果只是微小的改变直接光照(比如,轻微的改变光照的色调或者亮度),这样可以利用原间接光为光照提供近似的动态效果,而不需要使用消耗更多计算时间的Realtime光照。间接光仍然时有微小的问题,不容易被发觉。这种方式对没有预处理阴影信息的光照效果非常好。这可以通过禁用光照的阴影,或者使用带实时阴影的Baked Indirect模式。由于shadowmasks时直接光照计算的一部分,移动这样的光照会导致阴影错误而出现视觉不一致的问题。
下面的视频展示了将混合光从烘培的位置移动很远的例子。注意当光照移走之后墙壁上红色间接光仍然存在https://youtu.be/o6pVBqrj8-s

技术细节(这部分没看懂)

对于混合光,光照路径的最后一部分(从光源到表面)也属于预处理过程。但是Unity仍然将直接光和间接光分开处理。Unity将间接光烘培到lightmaps和光探测器,这些会在运行时采样。间接光一般都是低频的,也就是看起来很平滑,不包含阴影细节或者光线变换。因此,在阴影有较强视觉影响时就使用直接光照来生成。
混合光的不同子模式,有不同的阴影预处理和存储的方式:

阴影信息可以预处理并存储到shadowmask中。shadowmask是一种UV布局、分辨率和对应lightmap一致的纹理。可以在每个纹理点存储最多4个光照的遮挡信息(这是因为当前的GPU限制纹理最多有4个通道)。数值范围从0到1,中间数值意味着柔软的阴影区域。
启用shadowmask后,光照探测器也会存储最多4个光照的遮挡信息。如果大于4个光照在探测器上交汇,其他的光照会退化成烘培光照。可以在Shadowmask overlap visualization模式下查看这种行为。这个信息是预处理的,因此Unity在shadowmask中存储的阴影是从静态GameObject投射到静态GameObject的。根据lightmap的分辨率,这些阴影的边缘可以更加光滑,提供比实时shadow map更好的质量。由于混合光在运行时会保留shadowmask通道映射,动态GameObject通过shadow maps投射的阴影可以正确的和静态GameObject的预处理阴影混合,避免双重阴影的不一致问题。
静态GameObject和动态GameObject产生的阴影唯一可察觉的区别在于预处理shadowmask和运行时shadow map的分辨率和过滤,以及预处理阴影支持多种形式的area lights,可以实现带有更真实半影效果的阴影。
alt text
这副图像中,烘培的shadowmask和实时阴影的分辨率相近(动态物体和周围静态环境的阴影都很清晰)
alt text
这副图像中,烘培的shadowmask分辨率比实时阴影的分辨率低很多(动态物体的阴影很清晰,周围静态物体的阴影很模糊)
Baked IndirectShadowmask的相同点是,直接光照总是实时计算并添加到lightmap中存储的间接光照中,so all Material effects that require a light direction continue to work。动态GameObject总是通过shadow map向其他动态GameObject在Shadow Distance的范围内投射阴影。
alt text
Baked Indirect模式:只有间接光会被预处理。
alt text
ShadowmaskDistance Shadowmask模式:间接光和直接遮挡会被预处理。
alt text
Subtractive:所有的光照路径都会被预处理。