ainatipen 发表于 2021-12-3 14:04

Unity光照图的一些烘焙技巧(Unite2018笔记)

5.20更新:看到一张好图,列出了enlighten光照图烘焙的各个阶段。可以印证后文的“Bake GI过程会先执行一次Precomputed Realtime GI”


------------------------------------------分割线-------------------------------------------
       专栏开了好久,结果因为犯懒+肝毕设一直没更新= =正好这两天去了Unite 2018,还是学到了不少干活,所以不如在专栏里总结一下,万一过两天就忘了呢。
       第一篇先整理一下Unity工程师分享的《Lightmap烘培最佳实践》。自己最近在做毕设的时候,烘焙lightmap踩了一些坑,这次的分享简直是雪中送炭...(。于是正好结合自己最近的坑总结一下。
1.加快烘焙速度

      Unity中的Lightmap烘焙速度一直是经常被人吐槽的一个问题,一个极其简单的小场景使用默认参数时烘焙都要几分钟,而大场景往往要烘几个小时甚至十几小时。不过Unity的烘焙系统有提供许多可调参数,通过合理调整这些参数能够显著加快烘焙速度。



我自己毕设中某个场景Lightmap烘焙页的参数

      讲师提到的第一个影响因素是Indirect Resolution,这个参数影响的是光照图中间接光的质量,它不影响阴影质量。Unity中的GI包括Realtime GI和Baked GI两种,而Baked GI是基于Realtime GI的计算结果进行进一步的计算。在第一步的计算中,需要对所有模型的表面进行分块/聚类(Cluster)操作,把模型体素化,表面分成一个个格子,再基于这个格子进行间接光照的计算。Indirect Resolution越大,Cluster数量越多,格子越密集,计算就越慢。而这个参数对于效果的影响不大,一般情况下无需调到太高值。



讲师PPT中对Indirect Resolution参数的测试,第一行是不同值的间接光效果,第二行是Cluster的预览

对于Indirect Resolution的设置建议:
室内:2-3 texels per unit
室外:0.5-1 texel per unit
大型地形:0.1-0.5 texel per unit
(然而它的默认值是5...)
       第二个影响因素就是大家耳熟能详的Lightmap Resolution,它影响的是阴影质量及最终烘焙得到的贴图大小。对于它的优化也很简单,减就完事儿了,越减越快。而这里的设置建议是,将该参数大小设置为Indirect Resolution的十倍,在shadow使用distance shadowmask模式时,这个值甚至可以更低(因为近处的阴影都使用了实时阴影)。而且这个值越小,最后烘焙的光照图也越小,能够起到节省内存的效果。
(然而在Unity里,它的默认值甚至达到了40)
      以下为我毕设中的一个场景全貌,这个场景在上面的参数下烘焙得到的贴图正好是一整张2048的贴图,甚至还有剩余,效果还算可以接受。



场景全景



对应的光照图

       另外,对于某些面积较大,或离得较远,不需要很高精度阴影的模型,也可以对它的光照图分辨率进行单独修改,修改位置在Mesh Renderer组件中。


       最终该模型的光照图分辨率为Final = Scale * Lightmap Resolution;
       第三个影响因素则是烘焙模型的数量。没错,既然烘焙那么慢,那少烘点不就快了吗?当然,不用害怕被美术打死,我们还有神器:Light Probe(光照探头)。这个东西的作用是参与烘焙,然后可以在自己参与烘焙的范围内,为动态物体提供间接光和阴影,总之就是一个能让动态物体实现接近于被烘焙的效果。在实际操作中,我们可以让重要的物体参与烘焙,而一些不重要的小物体就交给光照探头来解决,这样就能节省很大一部分内存。
       但是在极端情况下,若想让全场景都通过光照探头进行烘焙,Unity目前还无法实现这个功能。不过讲师提到了一种比较trick的方法,就是先用极低的参数对场景进行烘焙,然后通过两个Unity中的接口获取各个位置光照探头的颜色参数,并将其导出,然后在物体的shader中使用这个参数,从而实现节省内存的效果。



Trick方法的原文

      第四个影响因素是反射贴图的分辨率。反射使用的Cubemap太大会影响内存和烘焙效率,一般64或128即可。
      下一个因素是计算光照时展开的uv大小。在烘焙时,unity要将场景分成许多小块进行计算,而最终也需要将这些小块映射到一张平铺的uv之上,而切分时小块的数量过多也会造成光照贴图增大。这一点可以通过Mesh Renderer组件上的Optimize Realtime UV选项进行优化。对于不规则的物体,最好使用光照探针。



没错,就是Realtime,虽然是Realtime,但他确实会影响Bake的效果

       最后一个因素,还记得一开始时说的Cluster吗,它的分块数量影响着烘焙的速度。(这里的分块与第四点中的不同,第四点的切块本质为UV展开,而这里只是一种简化计算的手段,计算获得的是中间结果)。我们甚至可以直接调整它的分辨率。在工程文件夹里新建一个Lightmap Parameters,里面会有一些新的参数。


       调整红框内的参数,就能直接控制Cluster的分辨率了。一般来说,这个值可以取0.3-0.6之间。
2.提高烘焙质量

       从原则上来说,速度与质量是两个对立的东西。速度越快质量越差是个不可违背的自然规律,但是可以通过一些trick,使它看起来更好。
       首先,在低分辨率的光照图下,有时会出现阴影溢出,不该有阴影的地方错误显示出阴影的问题。这是由于UV在采样的时候有时会采样溢出,错误地采样到了其他模型上,从而造成显示错误。对于这种问题,需要加大面与面之间UV的间距解决。模型本身各面直接的问题可以通过导入时,修改Generate Lightmap UV中的一个参数。



加大这个值可以避免上述问题

      而不同模型直接则是通过调整Bake设置中的一个参数。



同样也是加大就可以避免

       但是,我在做毕设的时候,遇到了模型接缝处会变黑的问题,当时尝试调整了这些参数但效果并不明显。偶然有一次我勾掉了Compress Lightmaps选项,发现这个问题奇迹般地好了,但代价是光照图的内存变大了三倍。我想这就是一个性能与效果取舍的哲学问题吧。
       在评价一张光照贴图的质量时,往往人们会通过阴影的质量来判断。所以这里也是一个很好的trick点。在光源中,有一个Baked Shadow angle选项,适当调大这个值能够让光照图在分辨率不变的情况下阴影变得更柔和,也就显得更像一个高质量的光照图。



我自己的场景中使用的参数

       对于阴影还有一个大杀器,让我们再翻出Lightmap Parameters,能够发现一个看起来很厉害的参数:



没错,就是Blur 模糊

       快速烘焙一个低质量的阴影,加个模糊,瞬间变成高大上的软阴影,美滋滋。(这里讲师建议可以调整到3-4)。

参考资料:

Baste 发表于 2021-12-3 14:14

阿阳不仅去了unite 还写了笔记 而我 依旧在肝毕设┭┮﹏┭┮

stonstad 发表于 2021-12-3 14:16

学习了

LiteralliJeff 发表于 2021-12-3 14:20

真.雪中送炭[爱]

ainatipen 发表于 2021-12-3 14:27

默认参数都是想要你命

xiangtingsl 发表于 2021-12-3 14:34

这场景好像元神的登陆场景

rustum 发表于 2021-12-3 14:43

可能这就是和米忽悠的缘分吧
页: [1]
查看完整版本: Unity光照图的一些烘焙技巧(Unite2018笔记)