全局光照(GI)是对直接和间接光照进行建模以提供逼真光照效果的一组技术。Unity 有两个全局光照系统,结合了直接光照和间接光照。
烘焙全局光照系统包括光照贴图、光照探针和反射探针。所有渲染管线均支持烘焙全局光照 (Baked Global Illumination) 系统。
光源模式
- Realtime
实时光源投射不超过__阴影距离 (Shadow Distance)__ 的阴影。
默认情况下,实时光源仅为场景提供实时直接光照。
为实时光源执行运行时计算可能成本很高,尤其是在复杂场景中或低端硬件上。
由于实时光源在默认情况下仅为场景提供直接光照,因此阴影看起来完全是黑色的,并且没有任何间接光照效果(例如颜色反弹)。这可能会导致场景中的光照不真实。 - Mixed
混合光源整合了实时光照和烘焙光照的元素。使用混合光源可以将动态阴影与来自同一光源的烘焙光照结合起来,或者在希望光源提供直接实时光照和烘焙间接光照时,也可以使用混合光源。
场景中所有混合光源的行为取决于 Lighting 窗口中的 Lighting Mode 设置。不同的光照模式具有非常不同的性能特征和不同级别的视觉保真度。
可在运行时更改混合光源的属性。这样做将更新光源的实时光照,但不会更新烘焙光照。进行此操作时,请注意避免不必要的视觉效果。
混合光源的性能成本因光照模式而异。但是,由于混合光源始终至少结合了一些实时光照和一些烘焙光照,因此混合光源始终比完全烘焙光照需要更多的运行时计算,并且比完全实时光照使用更多的内存。
果在场景中禁用了 Baked Global Illumination,Unity 会强制使混合光源表现得就像已将其 Mode 设置为 Realtime 一样 - Baked
Unity 在 Unity Editor 中为烘焙光源执行计算,并将结果作为光照数据保存到磁盘中。这一过程称为烘焙。在运行时,Unity 将加载烘焙的光照数据,并使用这一数据来照亮场景。由于复杂的计算是预先执行的,因此烘培光源可以减少运行时的着色成本,并减少阴影的渲染成本。
Unity 将直接光照和间接光照从烘培光源烘焙到光照贴图中。
Unity 将直接光照和间接光照从烘培光源烘焙到光照探针中。
无法在运行时更改烘培光源的属性。
烘焙光源不影响镜面反射光照。
动态游戏对象不会接收来自烘焙光源的光线或阴影。
GI和光源模式的关系
在不同的GI情况下,不同模式光源会产生不同的效果
- Realtime GI 和 Baked GI 都不勾选(静态物体无lightmap)
Realtime 实时渲染时:静态物体和动态物体都会计算该光源
Mixed 无法选择该模式
Baked 无法选择该模式 - 只勾选Realtime GI(静态物体有 realtime lightmap)
Realtime 烘焙时:静态物体的realtime lightmap会计算接受到该光源的间接光
实时渲染时:静态和动态物体都会计算该光源
Mixed 无法选择该模式
Baked 无法选择该模式 - 只勾选 Baked GI (静态物体有 baked lightmap)
Realtime 烘焙时:静态物体的baked lightmap不会计算该光源
实时渲染时:静态和动态物体都会计算该光源
Mixed 烘焙时:静态物体的baked lightmap会计算接受到该光源的间接光信息
实时渲染时:静态和动态物体都会计算该光源
注:不同的Lighting Mode设置会有不同的效果,文章的后面详细描述(当前为默认的shadowmask模式)
Baked 烘焙时:静态物体的baked lightmap会计算接受到该光源的直接光和间接光信息
实时渲染时:静态和动态物体都不会计算该光源
在bakedGI下,若场景只有realtime光源,则不会有lightmap,动态物体和静态物体的阴影都需要实时计算。若只有baked光源,则静态物体会烘焙好阴影,但是动态物体却不受该光源的影响,无法产生阴影。若你想把静态物体烘焙成lightmap,同时同一个光源又对动态物体产生影响,可以形成动态阴影,那就需要mixed光源的帮助了。
我们接下来看看Lighting设置中Mixed Lighting的三个设置:
- baked Indirect
只烘培静态物体的受到的间接光照,直接光以及阴影进行实时计算。只减少间接光照的实时计算,适合对光照要求较高的场景,内存消耗小,当然性能的消耗也大。这种光照模式提供逼真的光照和合理的阴影保真度,适用于中档硬件。
①混合光源照亮的动态游戏对象将接收:
实时直接光照。
烘焙间接光照(使用光照探针)。
动态游戏对象的阴影(使用阴影贴图),不超过阴影距离 (Shadow Distance)。
静态游戏对象的实时阴影(使用阴影贴图),不超过阴影距离 (Shadow Distance)。
②混合光源照亮的静态游戏对象将接收:
实时直接光照。
烘焙间接光照(使用光照贴图)。
静态游戏对象的实时阴影(使用阴影贴图),不超过阴影距离 (Shadow Distance)。
动态游戏对象的实时阴影(使用阴影贴图),不超过阴影距离 (Shadow Distance)。 - shadowmask
除了烘焙静态物体受到的光照,同时也会把静态物体受直接光照产生的阴影烘培到ShadowMask中,动态物体不受影响。内存中多了一份Shadowmask,减少了静态物体阴影的计算,占用性能小了一点。这是最真实但也是最耗费资源的光照模式,这种光照模式适用于高端或中档硬件。
①混合光源照亮的动态游戏对象将接收:
实时直接光照。
烘焙间接光照(使用光照探针)。
动态游戏对象的实时阴影(使用阴影贴图),不超过阴影距离 (Shadow Distance)。
静态游戏对象的烘焙阴影(使用光照探针),不超过以及超过阴影距离 (Shadow Distance)。
②混合光源照亮的静态游戏对象将接收:
实时直接光照。
烘焙间接光照(使用光照贴图)。
动态游戏对象的实时阴影(使用阴影贴图),不超过阴影距离 (Shadow Distance)。
静态游戏对象的烘焙阴影(使用阴影遮罩),不超过以及超过阴影距离 (Shadow Distance)。
关于Distance Shadowmask这里不再说明,请查看官方文档。 - subtractive
烘焙静态物体受到的直接光和间接光的信息(包含阴影,如同baked光源),性能消耗最小,这种光照模式不能提供特别逼真的光照效果,适合于风格化的艺术效果或低端硬件。
①混合光源照亮的动态游戏对象将接收:
实时直接光照
烘焙间接光照(使用光照探针)
主方向光照亮的动态游戏对象的实时阴影,使用阴影贴图,不超过阴影距离 (Shadow Distance)
静态游戏对象的实时阴影(使用光照探针)
②混合光源照亮的静态游戏对象将接收:
烘焙直接光照(使用光照贴图)
烘焙间接光照(使用光照贴图)
静态游戏对象的烘焙阴影(使用光照贴图)
主方向光照亮的动态游戏对象的实时阴影,使用阴影贴图,不超过阴影距离 (Shadow Distance)
以上部分转自:https://blog.csdn.net/wangjiangrong/article/details/100096586
光照贴图
渐进光照贴图程序 (Progressive Lightmapper) 是一种基于路径追踪的光照贴图系统,提供了能在 Editor 中逐渐刷新的烘焙光照贴图和光照探针,目前unity只支持渐进光照贴图程序
Meta Pass 是一个着色器通道 (Shader Pass),可为渐进光照贴图 (Progressive Lightmapper)提供反照率值和发光值,以便它们可以正确地从该游戏对象计算间接光照。要使某个游戏对象能够使用光照贴图,该游戏对象必须使用一个在着色器中包含 Meta Pass 的材质。Unity 的所有内置材质都具有 Meta Pass,并且标准着色器也包含 Meta Pass。如果使用了它们,则无需执行任何操作便会启用 Meta Pass。如果使用的是自定义着色器,您可以添加自己的 Meta Pass。
注意:在支持烘焙光照的场景中使用 Unity 的 LOD 系统时,该系统会将细节级别组 (LOD Group) 中细节级别最高的模型按照普通静态模型的方式照亮,要确保 LOD 较低的模型在烘焙光源下看起来正确无误,必须将光照探针置于模型周围
光照探针
光照探针有两个主要用途:
光照探针的主要用途是为场景中的移动对象提供高质量的光照(包括间接反射光,静态游戏对象的阴影等)。
光照探针的次要用途是在静态景物使用 Unity 的 __LOD(细节级别)系统__时提供该景物的光照信息。
要在移动的游戏对象上使用光照探针 (Light Probes),必须正确设置该移动游戏对象上的__网格渲染器 (Mesh Renderer)__ 组件。Mesh Renderer 组件具有 Light Probes 设置,此设置在默认情况下设为 Blend Probes。这意味着,在默认情况下,所有游戏对象都将使用光照探针,并在场景中改变位置时在最近的探针之间进行混合。
光照剪影和反射探针
用得比较少,这里就不说明了,可以看官方文档
关于Distance Shadowmask和Shadowmask
Distance Shadowmask 静态对象在阴影距离范围内使用实时阴影,在阴影距离范围外使用烘焙阴影
Shadowmask 静态对象全部使用烘焙阴影
详见这里
注:1、实时光照是通过环境反射模型和漫反射模型实时算出来的,实时阴影是通过渲染shadowMap(RenderTexturre)采样获得的。
2、烘焙光照是通过烘焙lightMap采样获得,烘焙阴影是通过采样shadowMask的RGBA通道获得