# 法线贴图 法线贴图是一种用于表现平面倾斜度的数据。 法线的取值范围是一个半球,如下图所示,处于半球边缘的任意点都可以代表法线的朝向。 法线贴图实际是将每个点的法线方向,按照颜色rgba的方式存储。其中r代表x轴旋转度,g代表y轴旋转度,b实际是轴本身的旋转,几乎无意义所以基本恒为1。 由于颜色值rgba属性中,不能为负值,取值范围为0-1之间的四组数值。所以将0.5作为垂直表面的法线基准值。故无凹凸表现的平面颜色值为(0.5,0.5,1,1);即为图中蓝点。 ![avatar](./img/normalMapPosition.png) 图1 将坐标转换成颜色的图解 由于法线贴图不包含海拔信息,故向右凸起等于向左凹陷,反之向左凸起等于向右凹陷。比如下方图片旋转180度,感受一下是不是就像是凹陷了一样。 ![avatar](./img/bumpTest4.png) 图2 实际的法线贴图(包含一个凸出的八边形,如果旋转180度,则是凹陷的八边形) # UnpackNormal函数应用 上一节讲了,由于法线贴图不能包含负值,所以在UnityShader的使用过程中,需要对法线进行一次变换,使之范围从原来的【 0 ~ 1 】转换为【 -1 ~ 1 】 故而 UnpackNormal ( packednormal ) = packednormal.xyz * 2 – 1 图2 执行完该方法后,会变成图3所示的样子 ![avatar](./img/UnpackNormal.png) 图3 UpackNormal 方法执行后 到这里可能会有人奇怪了,为什么左方跟下方都是一样的颜色。这个方法执行之后,实际上黑的部分是负数,负数的颜色是没法正确表现的,故变成了黑色。我们进行一次abs绝对值函数处理,就能看到对应颜色啦。 ![avatar](./img/abs_UnpackNormal.png) 图4 abs绝对值处理