GI是啥
Realtime GI,实时全局光照,听上去就是一个非常高大上的词,但是越高大上就越令人心生敬畏,因为世上没有免费的午餐,越好的效果意味着越多的消耗,对于移动平台来说,这样的消耗受不受的起呢?首先来说说GI是干啥的,非常粗略的来描述下,如果说我们以前的光照系统就是由光源 - 物体 - 视点组成的话,那么全局光照系统就是由光源 - n多环境反射光 - 物体 - 视点。就是说GI额外包括了环境反射光的计算,它可以使得渲染出来的场景物体间的光影交互更为真实。
如果是离线烘焙的话,n多的环境反射光就是通过辐射度算法或者是光线追踪算法一点点计算出来的,但是实时渲染没有这么多的时间。为了实现实时的GI,简单的说来,Unity(Enlighten GI)需要预计算一些信息,这些信息大概包括场景间物体之间的位置、反射关系,以及一个环境反射树(这些都是我瞎猜的),在实时渲染时,利用这些信息Unity会动态生成一张间接光照贴图,像原先的Lightmap一样只不过上面记录的是物体表面受到间接光的信息,这样在实时渲染时就会看到物体受到反射光的影响了。
因此Unity GI有了如下特点:
- 只能作用于位置静态的物体,因此它是实时的却仍然是静态的
- 光源可以实时变化
- 物体的材质可以实时变化,并对附近物体产生影响
而GI产生的开销主要包括:
- 对间接光照的额外计算,相当于多一个Pass处理多一个光源
- 当光源、物体材质改变时对于间接光照图的重新计算,这个计算是在一个单独的线程中进行的不会导致主渲染进程延迟,但是会产生效果延迟,也就是说当你改变光源时场景的颜色亮度可能并不会里面就变化。
- 需要一些额外的内存保持GI计算所需要的间接光照贴图,以及场景物体关系信息等。
GI与Lightmap
看的出来GI的额外性能消耗是可以接受的,我在手机上进行测试,即使是很大很复杂的场景跑起来也完全没有问题(当然也是因为我是在iPhone6上测的)。不过多数情况下如果说你的场景中不存在光线变化或是动态的自发光材质,还是固定镜头的话(没错&