创建时间
Mar 28, 2023 07:58 PM
标签
Tags
烘焙光照
Unity
Origin
element3ds.com
Unite 2018 | Lightmap 烘焙最佳实践
今天我们将由 Unity 技术支持工程师柳振东就针对 Enlighten 系统,和大家分享在 GPU 加速来临之前,如何加速 Lightmap 烘焙速度。
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 的大小会很大程度上影响烘焙的总体时间。
notion image
Indirect Resolution
Indirect Resolution 因为是决定间接光质量的,并不会影响最后出图的阴影效果,因此在保证间接光质量 OK 的情况下尽量调小这个值即可。
下图是我们对于不同场合下的建议值。场景中有多种场合的情况下可以统一设置一个参数后再对单独 Mesh Renderer 进行微调。
notion image
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,然后再根据效果适当往上调整。
notion image
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。
notion image
Realtime UV Charts SceneView
对于那些明显 UV Charts 太散的 Mesh Renderer,我们可以通过勾选 Mesh Renderer 组件上的 Optimize Realtime UVS 后调整 Max Distance 和 Max Angle 进行修正。这个过程我们需要保证 Lighting 窗口中的 Auto Generate 处于勾选状态,Scene view 中的可视化才会同步更新。
notion image
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。
notion image
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 来可视化,如下图所示。
notion image
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 上的像素分布,如下图所示。
notion image
间接光 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 参数调整。
notion image
Pack Margin
notion image
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 对其烘焙阴影进行一定程度的模糊。参数如下图。
notion image
Baked Shadow Angle
Blur the Lightmap 除了对阴影进行模糊,我们还能通过调整 Lightmap Parameters 中的 Blur Radius 参数对指定物体的 lightmap 进行整体模糊。在低 lightmap 精度要求下需要改善质量的时候不妨尝试下调整这个参数。一般建议设置在 2-4 之间。
notion image
Blur Radius
小结 最后建议大家看下官方优化 Precomputed GI 的教程,对于理解烘焙中各种参数的概念比较有帮助。 教程地址:https://unity3d.com/cn/learn/tut … e-gi?playlist=17102 > 本文由简悦 SimpRead 转码