目录
- Baked GI
- Lightmap和Light Probe
- Precomputed Real-time GI
Unity的全局光照系统采用Enlighten解决方案,包含Baked GI和Precomputed Real-time GI系统。在不开启全局光照时,Unity的光源只产生直接光照的效果,没有任何间接光照。
Baked GI
Baked GI
Baked GI采用一个离线的烘焙过程,将静态物体接收到的光照信息存入Lightmap中储存。由于烘焙是离线的过程,可以耗费时间来计算复杂的间接光照,将结果存入纹理供运行时直接采样。
使用
要使用Baked GI,需要在Lighting面板中勾选Baked Global Illumination选项。Lighting面板的右下方有一个Generate Lighting的按钮,就是我们的烘焙按钮。勾选左侧的Auto Generate(默认)则会自动进行烘焙,但对于较大的场景,最好不勾选Auto Generate,通过手动点击Generate Lighting按钮来进行烘焙。在烘焙前,我们需要确保场景中的静态物体勾选为static(至少是Lightmap Static),因为烘焙过程只考虑静态物体。如果场景中有Light Mode为Baked或Mixed的光源,其光照信息也会被烘焙,具体见下节。准备完成后进行一次烘焙(Generate Lighting)即可,可以在Lighting面板的Baked Lightmaps选项卡中看到所有的Baked Lightmap。
Light Mode、Mixed Light、Lighting Mode
Light Mode:Light组件的属性,有Realtime、Baked、Mixed三种选项。
- Realtime:实时光源,在不开启Precomputed Real-time GI的情况下,只产生实时的直接光照和阴影,不参与烘焙,无间接光照效果;
- Baked:烘焙光源,在开启Baked GI的情况下,烘焙间接光照、直接光照和阴影;
- Mixed:混合光源,具有三个子类型,在Lighting面板中的Lighting Mode选项设置,不同的子类型具有不同的表现。
Lighting Mode:Lighting面板中的属性,决定场景中所有Mixed光源的表现。有Baked Indirect、Shadowmask、Subtractive三种选项。(?)
- Baked Indirect:只烘焙间接光照,产生实时的直接光照和阴影;
- Shadowmask:烘焙间接光照和阴影,产生实时的直接光照,并将实时阴影与烘焙阴影进行混合,是表现最好且开销最大的Lighting Mode;
- Subtractive:烘焙间接光照和直接光照,只为场景中的一盏平行光产生实时阴影,是表现最差且开销最小的Lighting Mode。
Lightmap和Light Probe
在上节中,只有静态物体(static)可以参与Lightmap的烘焙。但往往我们希望场景中的动态物体(非static)也能够拥有全局光照的效果,这时我们就需要用到Light Probe(光照探针)。
与Lightmap十分相似,Light Probe也能够记录光照信息,不同的是Lightmap记录的是打在物体表面的光照信息,而Light Probe记录的是光线经过场景中的空间的信息(store information about light passing through empty space in your scene)。另外,Lightmap用纹理来记录光照信息,而Light Probe使用球谐光照技术来记录。Light Probe中光照信息的更新与Lightmap一样,在烘焙(Generate Lighting)的过程中进行。
要创建Light Probe,可以在Hierarchy面板中右键-Light-Light Probe Group,可以创建出一个包含多个Light Probe的组。之后我们同样需要进行一次烘焙(Generate Lighting),场景中的baked模式光源就会将直接与间接光照信息记录到Light Probe中,mixed模式的光源就会将间接光照信息(如果Lighting Mode为Subtractive,则直接光照也会被记录)记录到Light Probe中。
有了Light Probe之后,场景中的动态物体会从附近的Light Probe获取光照信息,从而能够 接受 到附近静态物体贡献的间接光照。需要注意的是,动态物体能够通过Light Probe接受到间接光照和烘焙光,但不会 贡献 任何间接光照,即不考虑那些打在动态物体上之后反射到其他物体上的光线。
Precomputed Real-time GI
原理
Baked GI能够为我们的场景提供较好的全局光照效果,但如果我们尝试着移动烘焙光源,我们会发现场景中的光照效果并没有随之改变,只有再次烘焙(Generate Lighting)之后,才会得到正确的效果。这也是Baked GI具有的限制:烘焙光源无法在运行时进行移动、旋转或是变换强度、颜色。
Unity的Precomputed Real-time GI(预计算实时全局光照)可以为我们解决这个问题。之前说到Realtime模式的光源只能够提供实时的直接光照,无法参与间接光照的计算。在离线烘焙(Generate Lighting)时,mixed和baked模式的光源参与Lightmap和Light Probe的计算,计算结果在运行时不产生变化。但如果开启了Precomputed Real-time GI,场景中Realtime模式的光源便能够将自身产生的 间接光 信息存入Light Map和Light Probe中,并且不像Baked GI中只离线烘焙一次,而是在 运行时 动态地更新,即系统将耗费资源在运行时动态地对Realtime光源的间接光进行烘焙。那么Realtime光源便能够在移动、旋转、改变强度和颜色的同时仍然产生正确的光照效果。
但是开销如此大的烘焙过程怎么能实时地进行呢?这其中主要有三点原因。
- Real-time Lightmap只需要记录间接光照信息,而间接光的变化往往是柔和、低频的,即不会产生高频突变,相比可能需要记录直接光照信息的Baked Lightmap,Real-time Lightmap可以大幅降低分辨率(这里的分辨率指的是为场景单位长度分配多大的像素区域,可以看看Lighting面板的Indirect Resolution和Lightmap Resolution两个参数)。
- 计算被分配到多帧进行。试着快速改变Realtime光源的属性,比如突然关闭光源,可以看到其间接光效果并不会随之立即消失,而是有一个渐变的过程,说明计算并没有在一帧内完成,每帧只需要完成一部分运算。这种做法优化了性能开销,但也会导致一些视觉效果的问题。对于一个缓慢旋转的光源(如场景中的主平行光,模拟日照效果缓慢旋转),多帧运算造成的问题并不明显;但如果我们需要做一个不停明灭闪烁的灯泡的效果,无法突变的间接光照就成了问题。但一些后处理方法也可以解决这一问题。
- 预计算加速数据。这也是为什么这项技术有Precomputed前缀。预计算的过程在烘焙(Generate Lighting)中进行,所以Precomputed Real-time GI技术也需要进行离线烘焙。预计算会记录下场景中静态物体之间光线传播的信息,这些数据能够加速实时的光照运算。
使用
要开启Precomputed Real-time GI,在Lighting面板中勾选Realtime Global Illumination选项,再进行一次烘焙(Generate Lighting)即可。场景中的所有Realtime光源现在都能够产生实时的间接光照效果,可以在Lighting面板的Realtime Lightmaps选项卡中看到所有的Realtime Lightmap。如果需要关闭某一盏Realtime光源的间接光效果,只要把它的Indirect Multiplier设置为0即可。
另外,Precomputed Real-time GI和Baked GI并不冲突,可以同时使用。比如将静态的光源设置为Baked模式使用Baked GI,为动态的实时光源开启Precomputed Real-time GI。关于更多的场景设置和参数设置技巧,可以参考Unity官方教程。