Symptoms
问题
- 场景只有一种材质,所有的网格渲染器都被设置为静态(静态批处理)用预处理烘培光来降低绘制调用的数量。运行场景时,显示的绘制调用数量比预期更多。
原因
导致使用烘培光的场景绘制批处理的调用被切分的一个因素是,分离的光照贴图是否被应用到了场景中的几何体上,正如下面的例子。在这个场景中,预期的结果是(不计算分离光照贴图)2次调用(批处理)。一个是场景中的几何体另一个是天空盒。但是这里我们看到了5个调用(批处理)。
在这个场景中,额外的的调用是因为光照贴图被扩展到两个光照贴图纹理上。我们可以通过左下角窗口中上方的图像看到。这个窗口是通过打开光面板并点击光贴图标签得到的。该窗口显示正在使用的光照贴图,以及窗口底部的一些关于光照贴图的信息(在场景中,使用的光照贴图有2 512x512)
分割是由于 Baked Resolution (烘培分辨率)高于 Atlas Size (图集尺寸) 512。Atlas Size (图集尺寸)限制了光贴图的的单个 UV组的大小。
解决方案
增加Atlas Size (图集尺寸)的大小将确保所有的UV组可以包含到同一个光照贴图图集中。设置为1024, 2048 或者 4096时需要考虑可能的纹理空间浪费的问题。
此时需要调整Atlas Size (图集尺寸)和Baked Resolution(烘培解析度)直到找到合适的最大单个光照贴图尺寸。
还有需要注意的是场景中的渲染器会导致单独的调用(不同材质),这些对象会被分配到不同的贴图上,因为它们自己产生的光照贴图纹理不会产生额外的成本。您可以通过指派自定义光贴图参数来打包对象。在光贴图参数资源中是System Tag(系统标签)字段。是:
“一组光贴图组合在同一个光贴图图集的对象被称为一个系统”。如果所有的光贴图无法被合并到单个图集中时,Unity会自动定义额外的系统及其相应的图集。然而,某些时候自己定义的系统会有很大的用处,例如创建动态加载级别。通过改变系统标签,您可以强制创建新的光贴图系统。标签的确切数值序号并不重要。
查看正在对象上发生的批处理的方法是使用Frame Debugger(帧调试器)。这将允许您查看包含的对象以及如何优化它们。
更多信息
https://docs.unity3d.com/Manual/GlobalIllumination.html
https://docs.unity3d.com/Manual/LightmapParameters.html