光照贴图的 UV 展开

创建光照贴图

光照贴图可能是场景创作中最困难的部分。我们依靠它们来呈现清晰的光照和阴影细节。它们需要被单独的做 UV 展开,以便模型的每一部分都有自己的贴图空间用于处理亮部和暗部信息。

必须要注意的是,光照贴图的分辨率远小于贴图 UV 的分辨率。除此之外还要明确一点,一个场景所需的优化越多,场景设计师缩减的光照贴图分辨率就越猛,对于小型物件甚至能降到 8x8 或 16x16。 这要求我们在光照贴图 UV 的每一部分周围留下众多的 '填充物',以免暗部区域 bleed(染色)到亮部区域,破坏游戏中的正常阴影感。

有 3 种方法可以创建光照贴图:

BOX UNWRAP(盒体展开)

这通常是给光照贴图展开的最可靠方法,因为大部分环境模型都是块状的,通过合并或复制的方式来创造某一结构。 连续网格模型(所有元素相互连接,没有独立元素)通常是一种有助于提高光照贴图展开效率的构建方法,因为您只要将大部分相互连接的设计元素展开。

这样做的效果不错,因为光照贴图的分辨率往往很低,如果由亮到暗的渐变发生在一个块上,它就更容易实现,如果是分步在多个支离部分中,就需要在这些块之间使用更多的填充物,才能让它们产生正确光照。

这时往往需要有更高的光照贴图分辨率,同时我们要尽量避免这种情况的出现。有时候,降低分辨率的做法不可避免,我们只能大大增加填充物的数量(尽管我们不想补充这么多)。

PLANAR UNWRAP(平面展开)

此方法最适合简单的平面设计,如带有少量斜面或突出物的墙面。它还适用于大型建筑立面,如房屋建筑。使用连续网格模型可以为平面展开带来巨大帮助,因为这更多的是要“松弛”网格模型 UV, 以及对游戏中没有正确光照的斜面进行更多的手动覆盖。

有时这需要大量的反复操作,但最好的方法是确保展开时的水平空间多于垂直空间,因为阴影投射通常是以轻度的仰角产生于侧面,而不是直接向下投射。

因此,水平空间为更清晰的阴影信息留出了更多余地,因为场景设计师在选择光照时倾向于创造更有趣的阴影,而如果使用由上而下的光照就达不到这样的效果。

CYLINDRICAL UNWRAP(圆柱展开)

除了盒体或平面类形状外,环境中的其他大部分形状都可以归为圆柱形的变体。对于那些拥有侧面和正面但却没有背面的设计对象,圆柱形算是一个不错的对策,否则要使用盒体展开方法的情形。

示例

BoxUnwrap1.jpg

这是一个连续网格模型,因此很容易进行盒体展开并将其水平展开,以使用尽可能大的光照贴图分辨率。中间图示中高亮显示的底面已经从整体分离开来,因为它们几乎始终会渲染成黑色, 如果它们与剩下的 UV 相连,就会在上面 bleed 成暗色,而实际上不该这样。

而在最下面的图示中,分离出来的顶面则正好相反,它们将始终保持明亮。最上面的图示显示了贴图 UV。

BoxUnwrap2.jpg

这是我们所能得到的最安全的连接方法,能让我们在游戏中以 32 x 32 单位的分辨率得到近乎完美的光照贴图。这里完全不会出现细缝,所以也不会看到不该出现的细小黑线。

BruteForce.jpg

有时只需要简单的将多个分块合在一起。为得到一个不影响光照贴图的干净表面,这样做是值得的。按照 1 比 1 的比率进行拉伸,并不会像覆盖方法那样影响光照贴图。 而 1 比 1 比率的超薄区域将因为 bleed 问题而无法产生正确光照,但 1 比 7 的比率加上两倍的覆盖则看上去令人满意。您还会发现我们对负向切口的内部进行了分离, 因为它们永远都是暗部,而我们要避免它们 bleed 到外部区域。

Facade1.jpg

平面展开很适合这样的大型立面分块。该网格模型属于连续网格,正好能给我们带来一些帮助,但同样的架构也适用于拥有少量垂直或水平元素的网格模型。 只要您在拥有少量多边形的最典型布局中针对光照贴图 UV 进行添置,结果就不会有什么变化,但也需要进行一些填充以免某些侧面部分在与其他分块一同堆叠时渲染为黑色。

Facade2.jpg

您会发现,连续网格模型布局能让我们更轻松的按照与低多边形网格模型形成镜像的方式来布置 UV。 我们仍然要将侧面、顶面和底面从主体部分移开,以免产生 bleed 问题,同时确保在它们周围进行填充,使主体和顶部窗户拥有相同的填充量。

有时您的设计并不适用于任何一项简单原则,如果一项设计中有镂空,或一些独立元素,我们就需要分割这些光照贴图并大大增加填充量。

NegativeSpaces.jpg

您会看到在连接栏杆的垂直相交部分有一些相当突兀的变形,我们只是在 3 个部分中分别强制将 2 个侧面与中间部分接合在一起。

利用圆形内部组件,我们让它自己分出了一个侧面,同时为另一个侧面附加了内面和外面。这样就可以让这些区域的 3/4 产生平滑的光照贴图着色,而只在另一面产生一个光照贴图破坏, 但由于其上方金属直梁的存在,您并不会看到这个瑕疵。

railingame.jpg

有些设计会与理想情况背道而驰,比如下面的这种情形。

Fragmented.jpg

如果有太多的独立元素存在,我们就只能增加贴图分辨率,否则就会因为每个部分之间的大量填充(这在游戏中会非常难看)而在光照贴图上浪费太多空间。 所以,我们计划采用 128 x 128 的光照贴图,我们知道这看上去仍然不会很完美,会存在一些 bleed 问题,但希望这不至于毁掉我们的对象。

GirderINGAME.jpg

有时我们可以很容易的实现近似水平设计并“松弛”UV,因为那些清晰分明的连续部分可以很轻松的连接在一起,就像下面的这个模型。

easy.jpg

这个设计其实只是一个带有平面基座和顶盖的圆柱体,所以我们使用了之前那两个基本方法来展开 UV。 最下面齿轮一样的部分很好处理,只要沿 Z 轴向下进行平面展开,然后应用松弛调整,再稍微做一下其他调整,就能避免任何部分出现覆盖过少的问题(来自于斜面上的超薄面 1 比 1 比率问题)。

中间的部分和底座一样没什么难点,通过手动来强制完成直线圆柱形展开,就能得到最大覆盖和空间利用。 和之前一样,我们更关心的是低多边形网格模型中每个小平面的覆盖问题,其次才是 1 比 1 呈现。我们对上方狮子头部分的底面进行了一个沿 Z 轴向上的平面展开,随后进行了松弛操作。

像这样分离模型有一个优点,那就是将实际接缝部分的接缝放入低多边形设计,使之看上去更自然,即亮部中有一处小的破损。 在具有清晰的深度凹陷或裂缝的部分中分离光照贴图 uv,可以很好的选择各个部分的分离位置,同时有助于提升模型在游戏中的外观并方便做出降级。

FountainINGAME.jpg

光照贴图坐标索引

默认情况下,在为静态光照生成光照贴图时,将使用静态网格模型的第一组 UV(索引 0)。这意味着向网格模型应用材质时所用的那一组坐标将同样被用于光照贴图。这样做往往不够理想。 其中一个原因是生成光照贴图所用的 UV 必须具有唯一性,因此网格模型的每个面都不能与 UV 空间内的其他任何面存在交叠。

原因不难理解:如果所有的面共享同一个 UV 空间,那么与这一空间对应的那部分光照贴图将被应用到所有的面。这对于散射及其他贴图来说倒是不错,因为这可以让每个面得到更高的贴图分辨率。 但这也会导致光照不准确。静态网格模型有一个名为 LightmapCoordinateIndex 的属性,可使用一组特定 UV 来生成光照贴图。通过将这个属性设置为指向一组唯一的 UV,同时再针对光照贴图进行适当设置, 静态网格模型将做到两者兼顾:既能为散射贴图提供更好的贴图分辨率,还能让光照贴图产生准确光照。

连续 UV 和填充

具有连续 UV 的三角形组被称为 UV 图表。

uvs_charts.jpg
UV 图

我们需要在 UV 图之间进行填充以避免物件的光照贴图互相影响。然而,我们不需要沿着光照贴图 UV 布局的边缘进行填充,因为 Lightmass 会自动在边缘周围加入足够的填充物以避免 bleeding artifact。 注意:在您设置 UV 图表之间的填充时,通常需要使用 4 个纹素(texel)来避免所有 bleeding,因为 DXT 压缩只能处理 4x4 的纹素块。

uvs_padding.jpg
UV 填充

这表明在光照贴图分辨率为 32 时,UV 图表之间的填充量应当是整个 UV 空间的 12.5%。但需要牢记的是,在 UV 图表之间放置更多的填充物,将造成光照贴图分辨率的增加而浪费更多的光照贴图存储资源。 您为网格模型制作的光照贴图 UV 越连续,您的工作就越轻松。这将减少所需的填充量并有助于增加分辨率。 在实现 Lightmass 之前或大量依赖顶点光照的情形中,网格模型可能已通过对元素进行单独建模后再进行合并的方式创建出来。

old_mesh_seperate.jpg
每块木板都作为一个独立元素被合并在一起。

但在依赖光照贴图并使用 Lightmass 时,这种方式就不够理想。这时将无法实现连续的光照贴图 UV。

old_mesh_uvs.jpg
旧网格模型 UV

您最后将得到支离破碎的光照贴图(显示出模型内部的多边形)并遇到渲染成黑色的情况,这些黑色将 bleed 到网格模型的其他部分。另一个潜在缺陷是依赖自动展开,这也会导致同样的问题。

old_mesh_ingame.jpg
游戏中的旧网格模型

创建网格模型并为光照贴图布置 UV 的最好方法,就是将整个网格模型建模为一个连续元素,然后再手动布置 UV。

new_mesh_contiguous.jpg
将资源重新建模为一个连续的单一元素,我们就能保证光照贴图的连续性。

这会产生连续的光照贴图 UV,从而消除接缝并提高光照贴图效率。

new_mesh_uvs.jpg
新网格模型 UV

最终得到的是一个拥有正确光照且不存在任何因为 UV 展开导致的贴图干涉问题的网格模型。

new_mesh_ingame.jpg
游戏中的新网格模型

这种方法还有一个另外的优势,那就是通常能减少模型所需的 tris (三角形)数量。

old_mesh.jpg new_mesh.jpg
旧网格模型 新网格模型