版本:Unity 6 (6000.0)
语言:英语
法线贴图
表面法线简介

法线贴图简介(凹凸贴图)

法线贴图是一种凹凸贴图。它们是一种特殊的纹理,允许你为模型添加表面细节,例如凸起、凹槽和划痕,这些细节会像由真实几何体表示一样捕捉光线。

Unity 使用 Y+ 法线贴图一种凹凸贴图纹理,允许你为模型添加表面细节,例如凸起、凹槽和划痕,这些细节会像由真实几何体表示一样捕捉光线。
参见 术语表
,有时称为 OpenGL 格式。

例如,你可能想要显示一个表面,该表面上有凹槽和螺丝或铆钉,例如飞机机身。一种方法是将这些细节建模为几何体,如下所示。

A sheet of aircraft metal with details modeled as real geometry.
一块飞机金属板,其细节建模为真实几何体。

根据情况,通常不建议将如此微小的细节建模为“真实”几何体。在右侧,你可以看到构成单个螺丝帽细节所需的多个多边形。对于具有大量精细表面细节的大型模型,这将需要绘制大量多边形。为了避免这种情况,我们应该使用法线贴图来表示精细的表面细节,并使用分辨率较低的多边形表面来表示模型的较大形状。

如果我们用凹凸贴图来表示这种细节,那么表面几何体可以变得简单得多,而细节则表示为纹理,该纹理会调节光线如何从表面反射。这是现代图形硬件可以极其快速完成的事情。你的金属表面现在可以是一个低多边形平面,螺丝、铆钉、凹槽和划痕会捕捉光线并呈现出深度,因为纹理的原因。

The screws, grooves and scratches are defined in a normalmap, which modifies how light reflects off the surface of this low-poly plane, giving the impression of 3D detail. As well as the rivets and screws, a texture allows us to include far more detail like subtle bumps and scratches.
螺丝、凹槽和划痕在法线贴图中定义,它会修改光线如何从这个低多边形平面的表面反射,从而产生 3D 细节的印象。除了铆钉和螺丝外,纹理还允许我们包含更多细节,例如微妙的凸起和划痕。

在现代游戏开发艺术管道中,艺术家会使用他们的 3D 建模应用程序根据非常高分辨率的源模型生成法线贴图。然后将法线贴图映射到模型的低分辨率游戏就绪版本上,以便使用法线贴图渲染原始的高分辨率细节。

法线贴图的工作原理

法线贴图通过使用纹理来存储有关如何在模型中修改表面法线的信息,从而将 表面法线 的这种修改更进一步。法线贴图是映射到模型表面的图像纹理,类似于普通的颜色纹理,但是法线贴图纹理中的每个 像素计算机图像中最小的单位。像素大小取决于你的屏幕分辨率。每个屏幕像素都会计算像素灯光。 更多信息
参见 术语表
(称为纹素)表示表面法线方向偏离平面(或平滑插值)多边形的“真实”表面法线。

Normal mapping across three polygons, viewed as a 2D diagram
跨越三个多边形的法线贴图,以 2D 图表的形式显示

在此图中,这也是 3D 模型表面上三个多边形的 2D 表示,每个橙色箭头对应法线贴图纹理中的一个像素。下面是一个法线贴图纹理的单像素切片。在中心,你可以看到法线已修改,从而在多边形表面上产生了一些凸起的外观。这些凸起只会因为光线在表面上的显示方式而显而易见,因为这些修改后的法线用于灯光计算中。

原始法线贴图文件中的可见颜色通常带蓝色调,并且不包含任何实际的明暗阴影 - 这是因为这些颜色本身并非旨在按其原样显示。相反,每个纹素的 RGB 值表示方向向量的 X、Y 和 Z 值,并被应用为对多边形表面的基本插值平滑法线的修改。

An example normal map texture
一个示例法线贴图纹理

这是一个简单的法线贴图,其中包含一些凸起矩形和文字的凸起信息。此法线贴图可以导入到 Unity 中,并放置在标准 着色器在 GPU 上运行的程序。 更多信息
参见 术语表
的“法线贴图”插槽中。当与颜色贴图(漫反射贴图)结合并在上面的圆柱体 网格Unity 的主要图形基元。网格构成了 3D 世界的很大一部分。Unity 支持三角形或四边形多边形网格。NURBS、NURMS、细分曲面必须转换为多边形。 更多信息
参见 术语表
的表面上应用时,结果如下所示

The example normal map applied to the surface of the cylinder mesh used above
示例法线贴图应用于上面使用的圆柱体网格的表面

同样,这不会影响网格的实际多边形性质,只会影响光线如何在表面上计算。表面上这些明显的凸起字母和形状并不真正存在,并且从掠角观看表面将揭示平面的真实性质,但是从大多数观看角度来看,圆柱体现在看起来像是从表面上凸起的浮雕细节。

凹凸贴图、法线贴图和高度贴图之间的区别

法线贴图高度贴图都是类型的凹凸贴图。它们都包含用于表示更简单多边形网格表面上明显细节的数据,但它们分别以不同的方式存储这些数据。

On the left, a height map for bump mapping a stone wall. On the right, a normal map for bump mapping a stone wall.
左侧是用于凹凸贴图石墙的高度贴图。右侧是用于凹凸贴图石墙的法线贴图。

上面左侧是用于凹凸贴图石墙的高度贴图。高度贴图是一种简单的黑白纹理,其中每个像素代表表面上该点应该出现的凸起量。像素颜色越白,该区域看起来就越凸起。

法线贴图是 RGB 纹理,其中每个像素代表表面看起来应该面向的方向差,相对于其未修改的表面法线。这些纹理往往具有蓝色紫色色调,因为向量是以 RGB 值存储的。

现代实时 3D 图形硬件依赖法线贴图,因为它们包含用于修改光线看起来如何从表面弹射的向量。Unity 也可以接受高度贴图进行凹凸贴图,但它们必须在导入时转换为法线贴图才能使用。

法线贴图中的颜色

了解这一点对于使用法线贴图并不重要!可以跳过本段。但是,如果你真的想知道:RGB 颜色值用于存储向量的 X、Y、Z 方向,其中 Z 为“向上”(与 Unity 通常使用 Y 作为“向上”的约定相反)。此外,纹理中的值被视为已减半,并添加了 0.5。这允许存储所有方向的向量。因此,要将 RGB 颜色转换为向量方向,你必须乘以二,然后减去 1。例如,RGB 值 (0.5, 0.5, 1) 或十六进制 #8080FF 会产生向量 (0,0,1),它对于法线贴图来说是“向上”的 - 并且表示对模型表面的没有任何更改。这是你在本页前面“示例”法线贴图的平坦区域中看到的颜色。

A normal map using only #8080FF, which translates to a normal vector of 0,0,1 or straight up. This applies no modification to the surface normal of the polygon, and therefore produces no change to the lighting. Any pixels which are different to this colour results in a vectors that point in a different direction - which therefore modify the angle that is used to calculate light bounce at that point.
仅使用 #8080FF 的法线贴图,它转换为法线向量 0,0,1 或“直上”。这不会对多边形的表面法线进行任何修改,因此不会对灯光产生任何影响。任何与该颜色不同的像素都会导致指向不同方向的向量 - 因此会修改用于在该点计算光线弹射的角度。

值 (0.43, 0.91, 0.80) 会产生向量 (–0.14, 0.82, 0.6),这是一个对表面的相当陡峭的修改。类似的颜色可以在一些石头边缘顶部的石墙法线贴图的亮青色区域中看到。结果是这些边缘捕捉光线的方式与石头的较平坦表面截然不同。

The bright cyan areas in the normalmap for these stones show a steep modification to the polygons surface normals at the top edge of each stone, causing them to catch the light at the correct angle.
这些石头的法线贴图中的亮青色区域显示了对每个石头顶部边缘的多边形表面法线的陡峭修改,从而导致它们以正确的角度捕捉光线。

法线贴图

A stone wall with no bumpmap effect. The edges and facets of the rock do not catch the directional sun light in the scene.
没有凹凸贴图效果的石墙。岩石的边缘和刻面不会捕捉场景中的定向阳光。
The same stone wall with bumpmapping applied. The edges of the stones facing the sun reflect the directional sun light very differently to the faces of the stones, and the edges facing away.
应用了凹凸贴图的同一石墙。面向太阳的石头的边缘反射定向阳光的方式与石头的表面和背面的边缘截然不同。
The same bumpmapped stone wall, in a different lighting scenario. A point light torch illuminates the stones. Each pixel of the stone wall is lit according to how the light hits the angle of the base model (the polygon), adjusted by the vectors in the normal maps. Therefore pixels facing the light are bright, and pixels facing away from the light are darker, or in shadow.
同一个凹凸贴图石墙,在不同的灯光场景中。点光源手电筒照亮了石头。石墙的每个像素都根据光线照射基础模型(多边形)的角度以及法线贴图中的向量进行照明。因此,面向光线的像素很亮,而背对光线的像素则更暗或处于阴影中。
法线贴图
表面法线简介