Unity高级开发-光照系统(四)- 加速Lightmap烘焙速度

从Unity 5.0版本我们推出了Enlighten烘焙系统,在Unity 5.6版本开始增加了Progressive烘焙系统作为备选,但是直到Unity 2018.1正式版本才脱离Preview状态。现在国内大部分开发者主要都使用Enlighten系统进行Lightmap烘焙。作为Progressive系统极大优势的GPU加速还需要到今年年底才会推出,因此接下来一段时间内大部分国内游戏开发者应该还会继续使用Enlighten系统。

Lightmap烘焙主要考虑二点:时间消耗与烘焙质量。首先我们先想办法减少烘焙时间。

Reduce the Quality of Indirect Globally

通过调节Indirect Resolution来,我们可以降低全局间接光的质量。如下图所示,Indirect Resolution位于Lighting窗口的全局设置内,应该是大家最熟悉的参数之一了。

Indirect Resolution与Lightmap Resolution不同,并不会影响最终Lightmap中的像素密度,而是影响烘焙中间过程中生成的一张间接光Lightmap(对用户不可见)的像素密度。Indirect Resolution对于烘焙的时间影响需要了解下烘焙的过程。

Enlighten在计算场景的间接光分布时会先把场景按一定粒度体素化,然后把Mesh离散为称作Cluster的小块,然后再以Cluster为单位发射光线收集光强信息,因此Cluster的数量直接影响了烘焙过程中间接光部分的计算时间。而Indirect Resolution是决定Cluster数量的最直接参数,因此Indirect Resolution的大小会很大程度上影响烘焙的总体时间。

Indirect Resolution

Indirect Resolution因为是决定间接光质量的,并不会影响最后出图的阴影效果,因此在保证间接光质量OK的情况下尽量调小这个值即可。

下图是我们对于不同场合下的建议值。场景中有多种场合的情况下可以统一设置一个参数后再对单独Mesh Renderer进行微调。


Indirect Resolution建议值

Reduce the Lightmap Resolution

因为能直接影响最后Lightmap的像素密度,Lightmap Resolution应该是Lighting窗口中大家调整最频繁的参数了。降低这个值可以直接减少烘焙时间以及lightmap占用内存,而质量降低的代价以阴影质量的降低最为显著。一般建议设为Indirect Resolution的10倍大小。

Reduce the Amount of Object Calculated

减少需要参与烘焙的物体数量,光照质量不重要的物体使用Lightprobe或者LPPV进行着色。极端需求下可以全场景使用Lightprobe着色。

这里大概说下方案。因为Unity本身不会给Ligtmap static的物体传输Lightprobe数据到GPU,我们可以利用LightProbes.GetInterpolatedProbe(), SphericalHarmonicsL2.Evaluate() API来得到指定位置的插值LightProbe并得到颜色信息,这样我们可以序列化好这些数据(比如用texture)然后在shader中使用。

Reduce the Reflection Resolution

降低Reflection Probe以及Environment Reflections的分辨率。减少烘焙时间的同时极大降低内存占用。一般建议不要超过256,可以先设置为64,然后再根据效果适当往上调整。

Reflection Resolution memory usage

Reduce Realtime UV Charts

减少Realtime UV Charts的数量,这里说的UV Charts不是最终lightmap的UV Charts,而是烘焙过程中生成的间接光Lightmap的UV Charts。

因为Enlighten的限制,每个Chart至少需要4*4=16个像素填充,因此Chart的数量越多总像素就越多,Cluster的数量也就越多了。所以对于一些形状不规则导致难以用较少的UV chart来展开的物体,例如碎石就应该不参与烘焙过程,使用Lightprobe进行着色。而对于Charts的数量,我们可以通过Scene view中的Global illumination->UV Charts模式来观察。如下图所示,颜色相同的表面使用同一个UV chart。

Realtime UV Charts SceneView

对于那些明显UV Charts太散的Mesh Renderer,我们可以通过勾选Mesh Renderer组件上的Optimize Realtime UVS后调整Max Distance和Max Angle进行修正。这个过程我们需要保证Lighting窗口中的Auto Generate处于勾选状态,Scene view中的可视化才会同步更新。


Adjust Realtime UV Charts

Reduce Clusters

前面我们做的事情归根究底就是为了减少Cluster的数量,除了上面提到的,我们可以通过Lightmap Parameters中的Cluster Resolution直接控制Cluster的密度。

Cluster Resolution的意思是烘焙中间过程的间接光Lightmap里一个texel可以容纳多少个Cluster。这个值一般建议设为0.3-0.6,同样我们可以通过Scene view中的Clustering模式来可视化Cluster的分布情况,如下图所示,方形的色块就是一个Cluster。


Cluster Scene View

对于场景中间接光照不理想的物体,我们可以在这个模式下观察Cluster的密度是否过低,从而通过对物体的Mesh Renderer单独赋予Lightmap Parameters来调高Cluster Resolution。同理对于Cluster密度过大的地方,我们可以调低其Cluster Resolution。

通过以上所述手段我们尽可能把烘焙的时间流程缩短后,可能会发现某些地方的烘焙质量不够,我们可以通过下面列举的方法进行微调。

Selective Lightmap Scale

通过Mesh Renderer上的Scale in Lightmap调整特定物体在最终Lightmap中的像素密度。这个选项大家应该经常用到,需要提醒是:这个值并不能影响间接光的质量。因此在感觉物体接收到的间接光质量太差的情况下,调整这个值并不能起作用,这个时候需要调整间接光Lightmap的分辨率,后面会提到这个参数。

物体在最终Lightmap上的像素密度可以通过Scene view中的Baked Lightmap模式并勾选列表最下方的Show Lightmap Resolution来可视化,如下图所示。

Baked Lightmap Resolution

Increase Indirect Quality Per Object

上面提到对特定物体提高间接光质量不能通过Scale In Lightmap参数,这时需要调整Lightmap Parameters中的Resolution参数。虽然Resolution参数位于Precomputed Realtime GI分类下,但是因为Baked GI也需要使用同一个系统计算间接光分布,因此这些参数直接影响Baked GI中的间接光计算过程。

我们可以通过Scene view中的Global Illumination->UV Charts并勾选列表最下方的Show Lightmap Resolution可视化物体在间接光Lightmap上的像素分布,如下图所示。


间接光Lightmap Resolution

Play Around With UV Padding(Baked UV)

调整UV Chart间的Padding基本都是为了消除Chart之间的Color bleeding。Padding有二种类型,一种是同一个Mesh Render内的UV Chart间的Padding,一种是不同Mesh Render间Chart的Padding。前者需要通过模型制作软件调整,如果Lightmap UV让Unity生成的话也可以在模型导入选项中通过Pack Margin参数调整。后者通过Lighting窗口中的Lightmap Padding参数调整。

Pack Margin
Lightmap Padding

Remove the Compress Lightmaps Option

出于优化内存的考虑,一般开发者都会勾选Lighting窗口中的Compress Lightmaps选项。Lightmap压缩会让着色质量下降,反过来我们可以在Lightmap Resolution不高的情况下不勾选这个选项,有可能就能达到我们想要的质量。因为提高Lightmap Resolution的方式对于Lightmap大小的增加量并不可控,可能最后得到的Lightmap size比一开始不压缩的size还要大。因此在微调质量的时候可以尝试反勾选这个选项,也许会有意外的发现。

Play Around with Baked Shadow Angle

在阴影质量不佳而决定提高Lightmap Resolution之前,我们还可以尝试调整灯光上的Baked Shadow Angle对其烘焙阴影进行一定程度的模糊。参数如下图。

Baked Shadow Angle

Blur the Lightmap

除了对阴影进行模糊,我们还能通过调整Lightmap Parameters中的Blur Radius参数对指定物体的lightmap进行整体模糊。在低lightmap精度要求下需要改善质量的时候不妨尝试下调整这个参数。一般建议设置在2-4之间。

Blur Radius
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354