法线贴图是一张RGB的图,每个颜色对应一个法线方向。
Red = X +/-
Green = Y +/-
Blue = Z +/-
在存储时,比如法线方向是(0,0,1),映射过去的方法是“加上1,然后除以2”
(0,0,1) + (1, 1, 1)=(1, 1, 2);
(1, 1, 2)/ 2 = (0.5, 0.5, 1) = (128,128,255);
解数据时
(128,128,255)=(0.5, 0.5, 1) ;
(0.5, 0.5, 1) * 2 = (1, 1, 2);
(1, 1, 2) - (1,1,1)=(0,0,1) ;
法线贴图分为“世界空间法线贴图”、“物体空间法线贴图”、“切空间法线贴图”,区分的依据就是表示法向量所用的坐标系。
在“世界空间”里,法线使用世界坐标系,意味着方向是绝对的,这就要求物体不能移动、旋转、弯曲等操作,否则法线就会有偏差甚至反向。
在“物体空间”里,法线使用物体自身坐标系,这样只要没有形变(如弯曲),移动或旋转不会造成法线方向有偏差。
在“切空间”里使用法线就自由多了,约定为“原来面的垂直方向,为切空间的Z轴,表面UV坐标的方向分别对应XY轴”。可以看到切空间的法线方向是相对的独立的,无视物体的旋转移动弯曲等。
现在你能分辨出下面两张法线贴图哪张是“切空间”?哪张是“世界/物体空间”的吗?
因为在“切空间”里,法线的方向大多数情况下跟“面的垂直方向”不会差太多,也就是说法线的Z值经常接近1,这样换成RGB后blue通道的颜色是接近255的,所以“切空间”的图经常是偏蓝的。
在没使用法线贴图时,面的法线表现如下
应用法线贴图,面的法线表现
再说一下凸凹贴图(Bump maps)。它用一张灰度图表示了顶点与原始表面的高度差,然后用它对光照或亮度进行扰动,使表面更丰富。