烘焙GI的优化

思考并回答以下问题:

现在我们已经学会了如何使用烘焙GI作为一个场景的照明系统。但是实际操作时,你可能会遇到各种问题:

烘焙出来效果不好,这种情况主要是需要调参数和灯光(找美术同学帮忙吧)

烘焙时间过长,有些甚至渲染几天都没有渲染完成

今天我们就来学习一下烘焙GI的优化方法,如何在尽可能保证效果的情况下,提高烘焙的速度,提高工作的迭代效率,减少光照贴图的存储空间占用。

烘焙GI的优化主要包括两个方面:

全局参数的优化:如果你的场景是一个室外的场景,但是用了适合室内场景的很高的分辨率,那么烘焙时间一定会很长。

单个物体的优化:场景中物体的大小、重要程度都不相同,如果只使用了统一的全局参数,那这里面就有优化空间。

全局参数的优化
全局参数是烘焙效果和速度的基础,尽量设置符合场景大多数物体的参数。全局参数在Lighting面板上,下面我们来看一下各个参数对效果和烘焙速度的影响。

由于烘焙GI有两种:Progressive Lightmapper和Enlighten,建议使用默认的Progressive Lightmapper。下面我们分开讲解。

Progressive Lightmapper参数优化
如果Lightmapper是Progressive,那么跟我一起按照下面的顺序检查Lighting面板中的参数。参数的含义我们之前已经详细介绍过了,在这就不再重复。

使用默认参数,烘焙这个简单场景所需的时间是2分6秒

使用默认参数,烘焙这个简单场景所需的时间是2分6秒

Direct Samples和Indirect Samplers
Direct Samples默认值是32,Indirect Samples默认值是500。如果场景网格比较简单,比如平面较多,可以大幅减少这两个值。如果场景中物体比较复杂,不规则的面较多,从小到大逐渐增加这个值。

建议在能达到目标效果的基础上,该值尽量低,如果你的场景够简单,可以尝试用1。

小技巧
如果你的场景里建筑风格都类似,可以用一个建筑放到一个单独的场景里来进行参数的配置测试,寻找最佳的参数配置。可以大幅提高效率。就像我使用的这个只有一个房子的场景。

使用8,32的值,时间缩短到了16秒

仔细对比这张图和最开始默认值的那张图,你会发现效果是有区别的,但是如果效果能接受,不是节省了很多时间么?场景编辑、迭代效率也会提高很多。

Bounce
间接光反射的次数,默认是2。设置为0就会没有间接光的效果,所以建议设置为1,如果效果不能达到要求,再增加。

烘焙时间减少了21秒

Lightmap Resolution
一个单位使用光照贴图的像素的个数,默认值是40,也就是1米会使用40个像素来记录光照信息。

这个值不仅会影响烘焙的时间,更会影响光照贴图所占的存储空间,影响打包的体积。但是这个值非常影响光影的效果,所以对待这个值一定要慎重。最好的办法就是对待不同类型的物体单独设置,比如细节很多的物体设置的高一些,大的平面设置的低一些。

使用20的值,烘焙时间缩短了75%,但是能直接看到光阴质量的降低

Ambient Occlusion
AO影响的是环境光,对于有方向的光源不受其影响。如果你的场景里类似孔洞、墙壁拐角的地方很少,那么可以不启用AO。启用AO会增加一定的烘焙时间,烘焙时间会随着场景的复杂程度非线性增加。

如图开启了AO以后,烘焙时间增加了6秒

Direction Mode
是否存储方向信息用于法线贴图。如果你的场景中没用到法线贴图,那么可以选择Non-directional来节省一半的存储空间。(该参数对于烘焙时间没有优化)

贴图总大小是2.7M,相对默认参数的5.3M减少了一半,但是由于房子用到了法线贴图,所以视觉效果会受影响

Lightmap Parameter
本节我们只学习Baked GI相关的参数。

Anti-aliasing Samples
抗锯齿采样数。采样数越低,锯齿越明显,烘焙时间越快。采样数越高,锯齿越不明显,烘焙时间越长。默认是8。

降低到1,烘焙时间缩短了14秒

Baked AO
Baked AO中的两个值,提高以后可以增强AO的效果,但是会增加烘焙的时间。

Enlighten参数优化
如果你是从旧的工程升级过来Lightmapper可能会是Enlighten或者你手动选择了Enlighten,参数有一些不同,下面我们学习一下和Progressive Lightmapper不同的参数。

由于Enlighten也是预计算实时GI的后端,所以此处参数的优化方案对实时GI也有借鉴意义。明天我们会进行详细解释。

由于使用Enlighten时Unity不统计烘焙时长,这里用秒表计时56秒

你发现使用Enlighten烘焙时间少很多,但是最终效果只能等烘焙完后才能看到,不像Progressive在烘焙过程中,可以在场景中看到每一块烘焙的实时进展。

但是如果你仔细看场景,你会发现场景中的光照其实是不正确的,房子有几块光照很黑。(其实如果你仔细看上面Progressive中的光照,场景中也有几个地方的光照是不正确的)

通过Scene窗口的Baked GI中的Albedo模式,可以看到下图中,有很大一块都是黑色的。

这是为什么呢?

解决UV问题
烘焙GI的光照贴图使用了模型的第二套UV(UV2),一般模型在制作时为了节省时间并没有UV2或者UV2可能存在问题。那么如何解决这个问题呢?

Unity中有一个快速解决的办法就是自动生成光照贴图UV。具体怎么做呢?
选中Project中对应的模型文件。

在模型导入选项中勾选Generate Lightmap UVs,这样Unity会自动生成UV2,供烘焙光照贴图使用。勾选后别忘了点击Apply。

这时候我们再次烘焙看一下效果:

现在光照贴图正常了

Enlighten有一个优势就是有GI缓存(菜单栏Edit > Perferences打开),第一次烘焙完成后,后续进行烘焙时,Unity会在缓存中获取可用的数据加快烘焙的过程。

Enlighten中与Progressive中同名的参数作用是一样的,在这就不重复讲解了。

Indirect Resolution
间接光的分辨率。提高这个值可以增强间接光的效果,但是烘焙时间会加长。

Final Gather
能让场景更真实,但是选中会增加额外烘焙时间。

Lightmap Parameter
对于Enlighten后端,Lightmap Parameter中Precomputed Realtime GI部分的参数虽然标记为实时GI的参数,但是对于烘焙GI也会有影响(对于Progressive模式没有影响)。

Resolution和Cluster Resolution
虽然不会影响光照贴图中的分辨率,但这个参数会影响间接光的Cluster的生成。会在下一节实时GI优化中讲解。

这两个值越大,间接光的效果越好,但是Clustering阶段的时间会越长,造成总体烘焙时间越长。

Direct Light Quality
更高的值会让软阴影更准确,但是会增加烘焙时间。

单个物体的优化
Scale In Lightmap

可以单独设置单个物体在光照贴图中的分辨率,如果全局分辨率是40,单独设置Scale In Lightmap为0.1,那么该物体的1米所占的像素为40x0.1=4个。

对于场景内的大型物体如地面、墙壁等可以用小一点的值。对于场景内非常精细的物体,可以用大一点的值。

调试技巧
可以通过Lighting面板的Object maps查看选中的物体所在的光照贴图的详细情况。

如果没有显示对应的光照贴图,请检查:1、已经选中一个Static的物体 2、场景已经烘焙完成 3、烘焙过后没有修改过场景

Lightmap Parameter
单个物体也可以单独设置Lightmap Parameter。根据物体的用途和在场景中的重要程度,参考上面讲到的Lightmap Parameter进行设置优化。

一般仅在发现这类物体对烘焙时间、光照效果影响较大时才进行调整,否则保持默认值即可。

总结
今天学习了使用Unity中的光照系统中的烘焙GI的优化,可以将本篇当作一个优化手册(检查清单),在需要优化时对照逐项检查。

今日思考题
构建一个简单场景,调整本文中提到的参数,看看对烘焙时长、光照贴图大小和最终效果有什么影响~

0%