Language:
Page Info
Engine Version:
Share

光照贴图的UV展开

关于创建光照贴图

光照贴图可能是创建环境艺术中难度最高的一环。我们依靠它们来呈现清晰的光影细节。它们需要单独展开,以便模型的每一部分都有自己的空间来接收明暗信息。

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

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

盒体展开(Box Unwrap)

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

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

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

示例

BoxUnwrap1.jpg

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

而在底部图示中,分离出来的顶面则正好相反,它们将始终保持明亮。顶部图示显示了纹理UV。

BoxUnwrap2.jpg

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

BruteForce.jpg

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

Facade1.jpg

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

Facade2.jpg

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

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

NegativeSpaces.jpg

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

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

railingame.jpg

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

Fragmented.jpg

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

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 Charts

  1. UV图表

在UV图表之间进行填充是必要的,以免渗透穿帮。但不需要在光照贴图UV局部的边缘进行填充,因为全局光照自动充分填充边缘,以免渗透穿帮。请注意,如果您要设置UV图表之间的填充,通常需要4个纹素来避免所有渗透,因为DXT压缩只能处理4x4的纹素块。

uvs_padding.jpg

UV Padding

  1. 多余的UV填充

  2. 必要的UV填充

这表明在光照贴图分辨率为32时,UV图表之间的填充量应当占据整个UV空间的12.5%。但请记住,在UV图表之间放置更多的填充物,将造成光照贴图分辨率增加,从而浪费更多的光照贴图存储资源。您为网格体制作的光照贴图UV连续性越高,您就越轻松。这将减少所需的填充量并提高分辨率。在实现全局光照之前或很大程度依赖顶点照明时,通过对元素进行单独建模后再进行合并,就能创建出网格体。

old_mesh_seperate.jpg

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

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

old_mesh_uvs.jpg

旧网格体UV

您最后将得到被渲染成黑色且分散的光照贴图(多边形在模型内部),这些黑色将渗透至网格体的其他部分。另一个潜在误区是依赖自动展开,这也会导致同样的问题。

old_mesh_ingame.jpg

游戏中的旧网格体

创建网格体和为光照贴图布局UV的最佳方式是将整个网格体作为一个连续元素建模,并手动布局UV。

new_mesh_contiguous.jpg

将资源作为连续的单个元素重新建模,能让我们确保光照贴图也是连续的。

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

new_mesh_uvs.jpg

新网格体UV

最终结果是网格体得到正确光照,且没有任何渗透穿帮问题。

new_mesh_ingame.jpg

游戏中的新网格体

此方法还有一个好处,那就是通常还能减少模型所需的三角形数量。

old_mesh.jpg

new_mesh.jpg

旧网格体

新网格体