关于NormalMap

    通常,NormalMap使用和一般正常的2D贴图相同的图片格式来储存,图片文件所能储存的都是正值,没有负值,不过Norml法线的数值有正有负。解决这个问题的方法是把Normal法线的数值范围由 -1~1转换到0~1,zaibatsu转后的数值放到图片中。PixelShader读取贴图后,再把它重新还原到 -1~1的范围内。

-1~1 转换到  0~1 的公式: f(x) = 0.5 * x +0.5

  0~1抓换到  -1~1 的公式: f(x) = 2*x-1 或者(x-0.5)*2 (通常用的)

   NormalMap中的法线信息是在一个切线空间(TangentSpace)中的,要想使用贴图中的发现信息由两种做法,一种是把贴图中的发现信息转换到世界坐标系中,第二种是把灯光法线向量转换到切线空间中,这两种都要用到一个 切线矩阵。

   切线矩阵TangentSpace 是一个正交矩阵(注: 关于矩阵中的正交矩阵),如果把贴图中法线向量转换到世界空间中那么 mul(TexNormal,TangentSpace),如果是把灯光法线转换到切线空间就是 mul(TangentSpace,LightNormal),矩阵左乘就相当于矩阵本身的转置,对于正交矩阵而已转置就是逆。

TangentSpace 的构建:

float3x3 TangentSpace;

TangentSpace[0]  = normalize( mul(Tangent , (float3x3)WorldITXf).xyz );

TangentSpace[1]  = normalize( mul(Binormal, (float3x3)WorldITXf).xyz );

TangentSpace[2]  = normalize( mul(Normal  , (float3x3)WorldITXf).xyz );
其中 Tangent 顶点的切线, Binormal 顶点副法线, Normal  顶点法线.

如何计算这三个向量

我们只要计算出,Normal,Tangent 就可以计算出 Binormal= cross(Tangent , Normal )

原文地址:https://www.cnblogs.com/ThreeThousandBigWorld/p/2746373.html