Unity5全局光照GI与新烘焙系统解析

发表于2017-10-28
评论0 2.3k浏览

GI是啥

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

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

因此Unity GI有了如下特点:

  1. 只能作用于位置静态的物体,因此它是实时的却仍然是静态的
  2. 光源可以实时变化
  3. 物体的材质可以实时变化,并对附近物体产生影响

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

  1. 对间接光照的额外计算,相当于多一个Pass处理多一个光源
  2. 当光源、物体材质改变时对于间接光照图的重新计算,这个计算是在一个单独的线程中进行的不会导致主渲染进程延迟,但是会产生效果延迟,也就是说当你改变光源时场景的颜色亮度可能并不会里面就变化。
  3. 需要一些额外的内存保持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的相关参数,可以在烘焙速度、烘焙效果、烘焙图质量之间取得一个可以接受的结果。

Environment Lighting下的全部设置以及General GI中的Indirect Intensity和Bounce Boost都是可以在RealtimeGI下实时调整的参数,这里就不详细解释了,试试就知道。这里主要讲讲静态烘焙图的相关参数,做静态烘焙第一步要确定烘焙图的大小,这在手机平台是很关键的,与最终烘焙图大小相关的有这样一些参数。

  1. General GI - Directional Mode 
    这一项决定了你烘焙出来的图是1份、2份还是4份,也就是内存占用是x1、x2还是x4,默认是Directional会生成两份,一份是光线烘焙图另一份是Directional Lightmap。具体干啥的我也说不清楚,文档里有解释,反正就是越费越nb,不过我可以负责任的说在大场景中Directional与None-Directional基本看不如太大区别,所以如果游戏是内存敏感的千万不要犹豫不要忘记直接把这项选择为None-Directional。烘焙出来的光照贴图就是我们最熟悉的样子。
  2. General GI - Atlas Size 
    顾名思义就是每一张光照图的大小,如果设置的太小的话一个是会降低大物体的烘焙分辨率(单个物体的烘焙结果必须保存在一张图内),另外也会增加总光照图的数量。
  3. Baked GI - Baked Resolution/Baked Padding 
    和原来的设置意思是一样的,越高精度越大,需要的烘焙像素越多,需要的烘焙图数量也可能会因此增加。
  4. Baked GI - Compressed 
    对于手机平台不要犹豫勾上这项吧,会对最终生成的Lightmap进行压缩,会大幅降低其文件大小。
  5. Object - Scale In Lightmap 
    在设置了Baked Resolution后还可以对单个物体的烘焙精度做出调整,对于不重要的物体来说可以将值设置为小于1,对于重要的物体可以将其值设置的更大。最终每个物体的烘焙精度可以在Scene View中GI下的任何一种视图模式中看到。下图中球体的Scale为0.2,地面的scale为2 

    无论scale设置为多大,最终单个物体的烘焙像素不能超过一张Lightmap的大小,再大的值也无效了,此时会显示出提示信息,提示物体像素密度已达到最大,更高的值就没有意义了。如果你希望一个物体完全使用单个的一张烘焙图时(比如地形)你可以调整这个值直至出现这个提示。如果出现这个提示时对于像烘焙素密度仍然不满意的话就需要考虑提升Atlas Size的大小了。另一个技巧是如果你只需要在烘焙时加入物体投射的阴影而不需要渲染该物体,可以将scale设为0. 

  6. 以上参数都是与烘焙图的大小相关的,另外剩下的参数就是与烘焙质量有关了,同时也会显著的对烘焙时间产生影响(当然烘焙图大小本身也是烘焙时间长短的决定性因素)

相信现在大家都能对Unity5全局光照GI与新烘焙系统有了一个新的认识吧,希望可以帮到大家以后的开发。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引