Comb map(梳状图)

Comb map
梳状图,也叫各向异性方向图(Anisotropic map),或者Flow map,或者矢量场图。
用途都是用来偏移某向量用的,在这里作为tangent方向矫正各向异性高光形状及方向的功能。根据个人的理解其本质应该就是切线空间下的Binormal。
先了解下法线:一个三角形有三个顶点,GPU在绘制三角形的时候是以顺时针方向绘制还是已逆时针方向来绘制影响着法线究竟是朝上还是朝下。即绘制顺序决定了法线朝向。在Unity里遵循的是左手定律: 伸出手,握拳方向表示顶点的绘制顺序,那么大拇指指向的就是法线的方向。这样就有了正面背面之说,单面双面之说。
法线是一条单位向量,对应每个轴向上的分量范围是[-1, 1],而图片的颜色值是[0, 1],那如果想把物体的法线信息写入到一张图片上,就要做一个变换: 
color = normal * 0.5 + 0.5 
这样,我们就把法线信息存储在了一张贴图上,下次用的时候,直接对其进行采样 
normal = color * 2 - 1 
实际上法线纹理只存储了xy信息,对应shader代码:
fixed3 bump = UnpackNormal(tex2D(_BumpTex, i.uv.xy)).xyz;bump.z = sqrt(1.0 - saturate(dot(bump.xy, bump.xy)));

实际游戏中使用的法线贴图存储的并不是模型空间下的法线,而是切线空间(Tangent Space)。
切线空间是以该顶点为原点,切线为x轴,副切线(切线和法线叉乘)为y轴,法线为z轴,而得的空间。 TBN
Comb map(梳状图)
Comb map(梳状图)
在切线空间下,(0,0,1)表示我们之前所说的垂直于平面的法线,套用color = normal * 0.5 + 0.5将其转换为color值,那么就成了(0.5,0.5,1),打开Unity,把颜色调成(0.5,0.5,1),你会发现这个颜色正是蓝色
Comb map(梳状图)
我们常用的这张应该切线图(用来控制高光走势等)是一张大部分为浅绿色图,即(0.5,1,0.5),根据normal = color *2 -1将其装换为切线空间的坐标为(0,1,0)即Y轴,也就是副切线Binormal,也就是说实际上这张图为副切线图。处理方法与法线贴图类似,需要Unpack。
对应代码如下:
float3 combmap = tex2D(_TangentTex, i.uv);
combmap.xyz = combmap.xyz * 2 - 1; // Unpack
float3 tangent = UnityObjectToWorldDir(combmap.xyz);


参考资料: