为了真正解释法线贴图是如何工作的,我们首先要描述什么是“法线”,以及它如何在实时照明中使用。也许最基本的例子就是一个模型,其中每个表面多边形仅根据其相对于光源的表面角度进行照明。表面角度可以表示为从表面垂直方向突出的线,而该方向(它是矢量)相对于表面被称为“表面法线”,简称法线。
在上图中,左侧圆柱体具有基本的平面着色,每个多边形根据其相对于光源的角度进行着色。每个多边形上的光照在整个多边形区域内是恒定的,因为表面是平面的。以下是这两个圆柱体,其线框网格Unity 的主要图形基元。网格构成了 3D 世界的大部分。Unity 支持三角形或四边形多边形网格。Nurbs、Nurms、细分曲面必须转换为多边形。 更多信息
参见 术语表可见
右侧的模型与左侧的模型具有相同数量的多边形,但是着色看起来很平滑 - 跨越多边形的光照使表面看起来弯曲。这是为什么呢?原因是用于反射光的每个点的表面法线在多边形的宽度上逐渐变化,因此对于表面上的任何给定点,光线都会像那个表面弯曲一样反射,而不是它实际上是平坦的、恒定的多边形。
从二维图的角度看,平面着色圆柱体外部的三个表面多边形看起来像这样
表面法线由橙色箭头表示。这些值用于计算光线如何从表面反射,因此您可以看到光线在每个多边形的长度上将以相同的方式响应,因为表面法线指向相同的方向。这会产生“平面着色”,这也是左侧圆柱体多边形看起来具有硬边的原因。
然而,对于平滑着色圆柱体,表面法线在平面多边形上变化,如下所示
法线方向在平面多边形表面上逐渐变化,因此跨越表面的着色会给人一种平滑曲线的印象(如绿色线所示)。这不会影响网格的实际多边形性质,只会影响如何在平面表面上计算光照。这种明显的曲面实际上并不存在,从掠角观察面将揭示平面多边形的真实性质,但是从大多数视角来看,圆柱体看起来具有平滑的曲面。
使用这种基本的平滑着色,确定法线方向的数据实际上只存储在每个顶点中,因此跨越表面的变化值是从一个顶点插值到下一个顶点的。在上图中,红色箭头表示存储在每个顶点的法线方向,橙色箭头表示跨越多边形区域的插值法线方向的示例。