当配置UV展开参数时,理想的结果是找到一种生成的光照图表最少,同时光照贴图的扭曲度最低的参数组合。请记住,当启用UV Charts绘制模式时,这种扭曲程度可视化为应用到Scene视图中的对象物体的棋盘网格纹理贴图的拉伸程度。
在这个例子中,我们将会在我们的教学工程中应用我们所学习到的关于UV的展开过程,去优化一个对象物体的预计算时间。
* 打开例子工程中里的LightingTutorialStart场景。
*在Hierarchy窗口中选择其中一个叫做HouseBig02的对象物体。这些对象物体在Environment>Structures>Houses下已经被分组。
* 打开 Lighting 窗口(Window>Lighting) 并且 选择Object 标签页。
* 从左上方的标签页中的下拉菜单里选择Charting。
* 展开预览视图,注意这里显示了多少UV Shell以及对应颜色的光照图表的数量。
HouseBig02在我们的场景中是一个相当复杂的对象物体,使用了多个光照图表,但还可以调整UV展开设置来减少光照图表的数量。
不存在某个固定设置能适用于所有UV展开的情况,Unity的UV展开算法基于合理的默认设置尝试做出最优的决策。但是给用户一些指导,我们可能会获得一种更优的结果
* 在 Hierarchy 窗口中选择SelectHouseBig02。
* 打开Lighting 窗口 (Window>Lighting) 然后选择Object标签页。
* 降低Auto UV Max Distance的值到它的最小值0.1。
接下来会开始进行预计算,经过短暂的计算时间后,我们可以从预览视图看到光照图表数量明显增加许多,检查场景视图可以看到贴图只有轻微拉伸,这是好现象。但我们无法接受光照图数量增加过多。 因为光照图过多代表预计算时间会变长,在游戏运行时性能也会降低。
* 如果HouseBig02在 Hierarchy 窗口没有被选中, 那么选择它.
* 找到 Lighting窗口(Window>Lighting) 然后选择Object标签页.
* 设置Auto UV Max Distance的值为 10.
现在问题应反过来了,光照图的数量会减少,但可以从UV Charts绘制模式中看出,光照图拉伸的问题变得很严重。
我们知道Unity的UV展开算法通过合并UV shell尝试将光照图表的数量最小化。Auto UV Max Distance值得设置,在世界空间指定了允许将UV shells合并的最大距离。如果shell之间的距离比这个值远,它们将不会被合并。
所以当调低Auto UV Max Distance值时,被合并的UV Shell就会减少。这代表最后会生成很多单独的光照图表。 而当调高这个值时,距离很远的UV Shell都会被考虑合并,就会生成较少的光照图,但相对而言也会让光照贴图容易产生扭曲
对于大物体,有时可能需要调高这个值来确保覆盖整个网格面积,相反,如果是小物体,也可以调低这个值来产生更好的效果
对于我们例子中的对象物体HouseBig02来说,将Auto UV Max Distance的值设置为0.8,可以在光照图表的数量和失真度之间找到平衡。
* 如果HouseBig02在Hierarchy 窗口中没有被选中, 那么选择它。
* 打开 Lighting 窗口 (Window>Lighting) 然后选择Object标签页。
* 设置Auto UV Max Distance的值为0.8。
现在我们将会看一下Auto UV Max Angle这个参数。就像Auto UV Max Distance一样,这个值影响着UV展开算法的UV合并阶段。在UV shells被合并前,除了测试距离以外,UV展开器还要测试mesh网格邻面之间的夹角。只有夹角在这个值以下的边缘才会被合并。
Auto UV Max Angle的值越小意味着越少的边缘会通过测试。结果,更少的UV shell将会倍合并,而这会导致光照图表数量的增加。反过来,Auto UV Max Angle的值越大,意味着UV合并算法将会包含更大的面之间的夹角值,更多的UV shell可能被合并,结果是生成更少的UV shell因此会有更少的光照图表。Auto UV Max Distance也是如此,如果值调的过大,在最后的光照贴图UV中,不合理的边缘将会被合并,而且会产生失真。
* 如果HouseBig02在 Hierarchy 窗口中没有被选中, 那么选择它。
* 打开 Lighting 窗口 (Window>Lighting)然后选择Object标签页.
* 设置Auto UV Max Angle的值为0.
当我们观察Lighting窗口中的Preview区域时,我们可以看到生成的光照图表的数量是无法接受的多。这时因为我们所允许的面之间的角度要小于等于0时,光照图表才会合并。这几乎意味着没有UV shell会通过测试,因此许多光照图表将会保持下面的合并过程。
接下来我们将会试着增加Auto UV Max angle的值
* 如果HouseBig02在Hierarchy 窗口中没有被选中,那么选中它。
* 打开Lighting 窗口 (Window>Lighting)然后选择Object标签页。
* 慢慢地增加Auto UV Max Angle的值, 在Lighting窗口中的Preview区域观察每次改变的影响效果。
我们可以看到随着Auto UV Max Angle值的增加,光照图表的数量也随着减少。结果光照贴图的UV shell的数量少了并且相对应的光照图表的数量也减少了。
对于我们例子中的对象物体HouseBig02来说,设置Auto UV Max Angle的值为93可以产生很好的效果。
* 如果HouseBig02在 Hierarchy 没有被选中, 那么选中它。
* 打开Lighting窗口 (Window>Lighting) 然后选择Object标签页。
* 设置Auto UV Max Angle的值为 93。
在一次简短的预计算之后,在Lighting窗口中的Preview区域中观察光照图表的数量是如何被减少的
在这个阶段,我们优化过的UV展开设置可以应用到工作的场景
* 如果HouseBig02在Hierarchy 窗口没有被选中,选中它。
* 在 Inspector 面板, 找到MeshRenderer 组件然后在它的显示区域的右上角点击cog图标 。
* 点击Copy Component。
* 打开LightingTutorialStart场景。
* 在Hierarchy中找到所有命名为HouseBig02的对象物体。
* 按下Ctrl(Cmd on the Mac) 然后在Hierarchy窗口中点击 每一个HouseBig02的游戏对象物体,全选它们。
* 打开Lighting 窗口 (Window>Lighting) 然后选择Object标签页。
* 在右上角选择cog图标。
* 选择 Paste Component Values 去应用你之前复制的设置。
当必须调整场景中好几百个对象的设置时,这样的操作更能节省时间,将时间花在其它优化上。
UV展开设置:每个实例或者每个Prefab?
UV展开设置可以存储在一个Prefab中,通过将它们保存到那个prefab hierarchy层级中的任何静态的MeshRenderer组件中。或者,UV展开设置也可以被保存到场景中的GameObject。UV展开设置存储到场景中一个prefab的实例将会覆盖掉存储在prefab中的设置。这种工作方式为我们设置场景的光照提供一些有用的方法。
为你的Perfab配置一个默认的UV展开设置以及光照设置是很有用的。如果Prefab被实例化多次,为对象物体的UV展开过程进行预配置能够节省努力而不是在场景中去重复指定。
另一方面,这种做法适合一些特定场景的光照设置,在这种场景中的物体会受周围环境不同程度的影响。例如,在离玩家近的区域内看到的预制件实例可以设置更高的品质,反之,如果物体离得很远,那就不必使用同样的设置,这里应该降低光照贴图品质,并降低光照图的数量。
可以配置一个符合大部分情况的设置,然后在需要的情况下去覆盖这些设置。在这个光照教程的例子中,我们将会为场景中的每一个实例应用我们的设置。
为整个场景应用UV展开设置
现在是时候学以致用了,就以LightingTutorialStart场景为例。在显著改善了预计算时间后,设置场景应该用不了太久。操作步骤如下:
* 打开例子工程中的LightingTutorialStart场景。
* 在 Hierarchy 窗口中, 选中在Environment>Structures下的最上面的GameObject。
* 复制GameObject到一个空场景中去。
到了这里我们应该应用我们所学到的,关于UV展开参数以及用不同的值去实验。记住,请结合Lightning窗口Preview区域中的Charting模式去使用UV Charts 场景绘制模式。这将会使我们能够找到光照贴图失真度与光照图表数量之间较好的平衡设置。
如果不知道如何设置,LightingTutorialOptimal这个示例场景可以作为一个很好的参考,虽然大多数情况下使用预设值就可以得到很好的效果。
* 用不同的值对UV展开参数进行实验,知道在光照图表与光照图失真度之间找到平衡为止。
* 拷贝这些设置,返回LightingTutorialStart场景并将它们粘贴至所有其它相同的GameObject上。在hierarchy视图中全选所有对应的对象物体,将会使你用Paste Component Values命令快速地将设置应用到多个对象物体上。
* 在Hierarchy视图中,对每一个唯一命名的GameObject重复这个过程。
一旦所有在Structures群组下的所有GameObject都被优化了,将它们移动到Rocks群组下剩余的静态几何对象物体上。
以这种方式有条不紊地工作,去为你场景中的所有静态几何物体设置UV展开值,这个过程应该花费不了你几分钟的时间。这种手动准备的结果将会在光照场景时更快的迭代,并且在运行时有更好的性能。