天天看点

Unity烘焙时UV Overlap的解决办法

好久没写博客了,说忙的话也不算太忙只是搜肠刮肚也没想到要写什么东西好,写一些无意义的东西还不如不写。

最近研究了下Lightmap,之前没研究是因为觉得这东西没什么可研究的价值,点一下Generate,把物体整成Static的不就什么都有了吗。然后鼓捣了一下,发现不对啊,这UV Overlap怎么搞不掉,看了下官网发现各个参数都写得很详细还是中文的,这里我就挑几个我感兴趣以及和UV Overlap相关的参数说一下(以下用Progressive CPU做例子)。

首先是Direct Samples、Indirect Samples、Environment Samples三兄弟:

Unity烘焙时UV Overlap的解决办法

它们分别可控制渐进光照贴图程序用于直接光照、间接光照、环境光照计算的样本数,增加此值可以提高光照贴图的质量,但会延长烘焙时间。默认值分别是32、500、500,这三个值在测试的时候可以调低用来减少烘培时间,相当的方便。当然,场景比较简单的时候也没必要去调。

Bounces:

Unity烘焙时UV Overlap的解决办法

使用此值来指定在追踪路径时要执行的间接反弹次数。对于大多数场景,两次反弹就足够了。对于某些室内场景,可能需要更多次反弹。环境反射里也有一个Bounces,不同的是它是设置反射探针评估对象之间来回反弹的次数。

然后是Lightmap Resolution、Lightmap Padding、Lightmap Size:

Unity烘焙时UV Overlap的解决办法

这三个值将会影响你光照贴图的张数和大小,其中会影响其中对UV Overlap影响最大的是Lightmap Resolution,官方的定义是:使用此设置来指定用于光照贴图的每个单位的纹素数。增大此值可提高光照贴图质量,但也会增加烘焙时间。这里的单位官方没用明确的定义,估计也不好定义吧,反正就是值越大,网格在光照贴图里占的面积最大,默认值是40。

我的场景如下:

Unity烘焙时UV Overlap的解决办法

当Lightmap Resolution=40、Lightmap Padding=2、Lightmap Size=512下,只有一张光照图,三个物体公用一张光照图,还空出了一半:

Unity烘焙时UV Overlap的解决办法

当Lightmap Resolution=100、Lightmap Padding=2、Lightmap Size=512下,三个物体各用一张烘培图:

Unity烘焙时UV Overlap的解决办法

Lightmap Padding是用来设置来指定烘焙光照贴图中不同形状之间的间距(以纹素为单位)。默认值为 2。指的是两个Mesh间的间距。

Lightmap Padding=2:

Unity烘焙时UV Overlap的解决办法

Lightmap Padding=10:

Unity烘焙时UV Overlap的解决办法

UV Overlap只发生在Mesh的内部,所以Lightmap Padding并不会对它产生影响。

Lightmap Size就是光照图的尺寸,但是好像场景比较小的时候Unity会自动帮你减小尺寸。

UV Overlap解决方案

首先,最重要的一步,给需要进行烘培的物件在 Import Settings 勾上Generate Lightmap UVs,给物件生成光照贴图UV。

Unity烘焙时UV Overlap的解决办法

Hard Angle:

相邻三角形之间的角度(以度为单位),Unity 根据此角度将其视为硬边缘并创建接缝。您可以将角度设置为 0 到 180之间的值。默认情况下设置为 88 度。 如果将此角度设置为 180 度,Unity 会认为所有边缘都是平滑的,这适用于生物模型。默认值(88 度)适用于机械模型。

Pack Margin:

在假设网格占据整个 1024x1024 光照贴图的前提下,相邻图表之间的边距(以像素为单位)。您可以将此值设置为 1 到 64 之间的值。较大的值会增加边距,但也会增加图表所需的空间量。默认情况下,此值设置为 4。

Angle Error:

UV 角度与源几何体中角度的最大可能偏差(百分比形式,范围从 0 到 100)。默认情况下,此值设置为 8%。 此属性控制 UV

空间中三角形与原始几何体中三角形的差异程度。通常,为避免在应用光照贴图时出现瑕疵,此数值应该相当低。

Area Error:

UV 面积与源几何体中面积的最大可能偏差(百分比形式,范围从 0 到 100)。默认情况下,此值设置为 15%。 此属性控制 Unity

保留相对三角形面积的程度。增大此值可以创建更少的图表。但是,增大该值可能会改变三角形的分辨率,因此请确保产生的失真不会降低光照贴图的质量。

我把官网关于这几个参数的描述都抄过来了,方便日后查询。在这里我们只需要了解Pack Margin就好了。

先用默认值烘培一下看看,这时的Lightmap Padding=20:

Unity烘焙时UV Overlap的解决办法

不出所料,再看看UV Overlap窗口:

Unity烘焙时UV Overlap的解决办法

Mesh Render的Lightmapping这里有两个参数也很重要,分别是Scale In Lightmap、Stitch Seams,Stitch Seams是接缝缝合,一般都是勾选的,而Scale In Lightmap指的是这个网格在光照贴图中所占的大小,这个也是解决UV Overlap的重要参数之一。

那么拢共影响UV Overlap问题的参数就三个:Lightmap Padding、Pack Margin、Scale In Lightmap,我把Scale In Lightmap调成2,Overlap小了许多:

Unity烘焙时UV Overlap的解决办法

再把Pack Margin由10调成30,解决了Overlap:

Unity烘焙时UV Overlap的解决办法

然后是前后的Lightmap对比,前:

Unity烘焙时UV Overlap的解决办法

后(这两张图都是256x256,虽然我的Lightmap Size设置的是512x512):

Unity烘焙时UV Overlap的解决办法

最后来看看树人,同样的参数Scale In Lightmap=2、Pack Margin=30,解决了Overlap,但是贴图尺寸变成了512x512。

Unity烘焙时UV Overlap的解决办法

最后的渲染效果,打了一个没有阴影的实时方向光来计算高光:

Unity烘焙时UV Overlap的解决办法

没有实时光:

Unity烘焙时UV Overlap的解决办法

其实也蛮简单的,一开始我以为会有很多东西可以写,但越写越感觉单薄,只是之前没有认真去看吧。