Unity 5 全局光照GI与新的烘焙系统初探

GI是啥

Realtime GI,实时全局光照,听上去就是一个非常高大上的词,但是越高大上就越令人心生敬畏,因为世上没有免费的午餐,越好的效果意味着越多的消耗,对于移动平台来说,这样的消耗受不受的起呢?首先来说说GI是干啥的,非常粗略的来描述下,如果说我们以前的光照系统就是由光源 – 物体 – 视点组成的话,那么全局光照系统就是由光源 – n多环境反射光 – 物体 – 视点。就是说GI额外包括了环境反射光的计算,它可以使得渲染出来的场景物体间的光影交互更为真实。

如果是离线烘焙的话,n多的环境反射光就是通过辐射度算法或者是光线追踪算法一点点计算出来的,但是实时渲染没有这么多的时间。为了实现实时的GI,简单的说来,Unity(Enlighten GI)需要预计算一些信息,这些信息大概包括场景间物体之间的位置、反射关系,以及一个环境反射树(这些都是我瞎猜的),在实时渲染时,利用这些信息Unity会动态生成一张间接光照贴图,像原先的Lightmap一样只不过上面记录的是物体表面受到间接光的信息,这样在实时渲染时就会看到物体受到反射光的影响了。

因此Unity GI有了如下特点:

而GI产生的开销主要包括:

GI与Lightmap

看的出来GI的额外性能消耗是可以接受的,我在手机上进行测试,即使是很大很复杂的场景跑起来也完全没有问题(当然也是因为我是在iPhone6上测的)。不过多数情况下如果说你的场景中不存在光线变化或是动态的自发光材质,,还是固定镜头的话(没错,我说的就是RPG),GI对于游戏来说仍然是没有用处的,所有GI能做到的事情用简单的Lightmap就能达到同样的效果。现在问题来了,Unity配合GI又搞了一个新的烘焙系统,这个系统要怎么玩儿呢。

首先,现在当你说烘焙时一定要弄明白你想烘焙的是Realtime GI所使用的间接光照图和场景树信息还是Static Lightmap,然后以此决定使用光源的类型是Realtime/Mixed/还是Baked。首先来说烘焙的方式,在Lighting面板中Precomputed Realtime GI 与Baked GI分别对应Realtime GI与Static Lightmap的烘焙。

组合起来就是三种(跟我说你啥都不烘的可以走了):

只烘焙RealtimeGI

关闭Baked GI或者场景中的全部光源类型设置为Realtime。这意味着没有任何光照颜色会被预先烘焙计算,引擎在烘焙时只是存储场景内静态物体间的关系,当烘焙完成后你可以自由的调整光源或物体材质,并实时地看到效果。 此时在Scene中观察Baked结果可以看到没有任何静态颜色被烘焙出来。

在仅使用RealtimeGI时,光源应该选择Realtime类型。烘焙选项Realtime Resolution对应前文所说的间接光照图,值越高间接光的效果就越明显(其实应该是越准确,当分辨率太低时间接光会因像素过滤而变弱) Realtime Resolution = 10

Realtime Resolution = 1

只烘焙Static Lightmap

取消Precomputed Realtime GI的勾选即为同原来一样的纯静态光照图烘焙。光源的选择则同原来一样,Realtime的灯光不参与烘焙,但同时作用于动态与静态物体上;Mixed光源参与烘焙,实时运行时仅作用于非静态物体;Baked光源仅作用于光照烘焙,不参与实时光照计算。 再次观察SceneView可以看到烘焙出来的颜色。

在Lighting面板中的Lightmaps页签中也可以看到烘焙出来的光照图。咦?怎么有两张,稍后解释

如果使用纯Static Lightmap烘焙时会有一个Indirection Resolution的设置,这个设置就对应于Precomputed Realtime GI中的Realtime Resolution,同样是控制间接光的影响,产生的效果是一样的。

同时烘焙Static Lightmap与RealtimeGI

如果同时烘焙Static Lightmap与RealtimeGI会发生什么事情呢?首先光源产生的光照以及物体间的二次反射光线都会被直接烘焙在静态光照贴图上,因此前文所提使用GI可以自由实时调整光源或是物体材质的效果在这种烘焙模式下都是没有用的,但是自发光材质以及天空光产生的辐射光线在这种模式下仍然是可以实时变化并叠加作用于已烘焙的颜色上。 光照烘焙颜色信息

辐射度信息

最终合成颜色

辐射度信息图中除了自发光的红色外还有一点点靛青色,这是天空盒产生的颜色,在Environment Lighting中调整Ambient Intensity可以控制天空盒对场景整体明暗的影响。总的来说主体颜色还是静态烘焙出来的Lightmap控制,但是增加了GI中的动态天空光和自发光。总的来说不建议使用这种方式进行场景渲染,又消耗了静态Lightmap和GI所需的内存,又消耗了GI的计算资源,效果还没单个使用的好。

在我看来GI最大的好处是可以让美术实时的看到使用Lightmap烘焙后的场景效果,也就是说首先关闭Baked GI仅烘焙一些Precomputed Realtime GI,随后美术就可以随意的调整光源、物体材质、天空盒等数值并实时观察到场景的最终效果,最后当一切都满意后关闭Precomputed Realtime GI使用Baked GI进行光照贴图的烘焙即可。

Lightmap的其他设置(坑)

新的Lighting面板里与GI或是烘焙的相关参数很多,我就挑点重要的来说。首先还是要分清楚这里面包括的两部分RealtimeGI与Static Lightmap Baking,其中RealtimeGI的相关参数也应该会影响到Static Lightmap Baking的结果,毕竟用的应该都是一套光照计算方法。所以在烘焙场景是最好首先只烘焙RealtimeGI,即关闭Baked GI,然后实时的调整RealtimeGI的相关参数以达到理想的场景渲染的效果,最后关闭Precomputed Realtime GI并打开Baked GI进行静态的烘焙。最终烘焙效果的上限就应该是通过RealtimeGI调试出来的结果,通过调整Static Lightmap Baking的相关参数,可以在烘焙速度、烘焙效果、烘焙图质量之间取得一个可以接受的结果。

只有经历过地狱般的折磨,才有征服天堂的力量,只有流过血的手指,才能弹出世间的绝唱。

Unity 5 全局光照GI与新的烘焙系统初探

相关文章:

你感兴趣的文章:

标签云: