什么是法线贴图?
法线贴图看起来可能有些奇特,但和其他任何纹理贴图一样,它们只是平面的二维图像。这里展示了一只3D鸟角色的特写镜头。右侧是该鸟的法线贴图特写。鸟羽毛上的高光和阴影正是由法线贴图的图案所创建的。
要理解法线贴图,首先需要了解“法线”这个词的含义。在几何学中,法线是一个垂直于表面或物体的向量或直线。
视频游戏中的每一个多边形都有一个表面法线,这些表面法线被用于光照计算。简单来说,多边形表面法线与光源方向之间的角度可以用来决定表面应该显得多亮或多暗。这导致了一种称为扁平着色的光照模型。
在现代3D图形中,多边形上的每个顶点都有一个法线,而不仅仅是表面。通过插值多边形上所有顶点的法线,即使几何细节相对较少,也能创造出物体的更平滑表现。这被称为Phong着色。
此球体展示了Phong着色示例,其中光照基于每个顶点的法线(而非每个面)计算。结果是在使用与扁平着色示例相同几何结构的同时,得到了一个更为平滑的球体表示。
尽管法线贴图是二维图像,但它们能够储存有限的三维信息。法线贴图中的RGB颜色通道(红、绿、蓝)分别对应表面法线的X、Y、Z坐标。虽然法线贴图无法表现深度的凸起和极端不规则的几何形状,但它们能够伪造平坦表面上的小凹陷和凸起。我用“伪造”一词,是因为法线贴图并未增加实际的几何体。相反,位图图像中的各个像素添加的法线被包含在光照计算中,从而产生了如果有更多几何体时应有的高光和阴影,但实际上并未增加任何几何体。
这对实时计算机图形——尤其是游戏——而言是一个非常有用的技巧,因为通常屏幕上的多边形越多,游戏运行速度就越慢。多边形越多意味着占用更多内存、需要着色的表面更多以及需要绘制和计算的内容更多。将复杂的几何细节转移到法线贴图中,使得3D模型能够快速渲染,同时保留大部分细节。
创建法线贴图的方法
有相当多的工具和工作流程可用于生成法线贴图,这可能是因为法线贴图处于建模和纹理化的交叉点。不过,它们都可以归类为烘焙或生成两种方式。
烘焙贴图
几乎所有的3D建模软件,如Maya 或3ds Max,都包含了从高模网格烘焙几何法线并重新投影到低模网格作为位图法线的功能。我们预先创建了一些资产,包括一只青蛙角色。我们首先以高细节度建模了这只青蛙,然后在Allegorithmic Substance Designer中烘焙了法线,最后将得到的法线贴图应用到了适合实时游戏环境的多边形分辨率的低模网格上。这使得青蛙能拥有更精细的高光和阴影,并且让我们能够在不实际在低模网格中包含该几何体的情况下,添加像背部凸起这样的细节。
生成贴图
法线贴图中的数据也可以在没有高多边形模型的情况下生成。我个人更倾向于在我的工作中使用这种方法,因为我只需建模低多边形网格即可。
生成的法线贴图数据可以从照片中获取:Allegorithmic的Substance Designer之类的工具能够从相对平面表面的照片中计算出法线信息。我曾使用羽毛的图片来为鸟角色创建法线贴图。
另外,法线贴图数据也可以通过程序生成,这意味着少量数据可以通过数学运算扩展为更复杂的图案。在这个无线电模型中,我在Substance Designer中通过缩放和变换许多圆形渐变的副本来创建小的扬声器孔。
法线贴图的工作原理
游戏美术师往往对法线贴图情有独钟,这是有充分理由的。法线贴图不仅模拟阴影,还模拟光线在表面的行为,包括反射。在创建金属材质时,我有时会混合一些低频Perlin噪声来在反射中制造轻微的扭曲,即便这种扭曲在真实凸起或凹陷中并不明显。下面是一块完全光滑的金条的样子。
而在这张金条的法线贴图中加入了一些低频Perlin噪声后,反射从完美的镜面效果变为稍微有些不规则(更可信)。Perlin噪声很微妙,你可能需要眯眼或模糊视线才能看到法线贴图中的大块凸起。
此外,除非表面设计为如哈勃望远镜般光滑,否则表面上总应有一定量的纹理。即便是打算做得相当光滑和干净的金属,我还是会添加非常轻微的高频噪声来增加表面的真实感。有时这在近距离观察下也未必可见,但我仍然希望它存在,以防光线条件或反射发生变化,使得游戏摄像机捕捉到表面纹理的清晰视图。
最后,这里有一张动图展示了金条在每一步的变化过程。
如果你刚开始制作法线贴图,可能会想尝试推高数值,给模型添加高度的凹凸效果。这几乎从来都不是个好主意。相反,法线贴图只应用于表现表面的轻度凹凸。如果一个表面确实有深洞(如无线电的扬声器孔),且大部分被光线遮挡,那可能是例外情况,因为它看起来与真实的几何细节相差无几。除了这个例外,尽量让法线贴图保持微妙。
评论留言