Unity-Shader切线空间

在使用凹凸纹理时我们经常会用到一个叫切线空间的东西。而这个切线空间里有三个参数,顶点法线(Normal)、顶点次法线(binormal)和顶点切线(tangent)。这三个参数有什么意思,是如何得来的呢?我们来详细讲下。
假设有一个三角形平面ABC,A点的切线空间就如图:(T,N,B两两正交)
注:
A点坐标pos1,B点坐标pos2,C点坐标pos3。
A点UV坐标uv1,B点UV坐标uv2,C点UV坐标uv3。
顶点法线(Normal)
这个好理解,就是垂直在顶点所在三角形平面上的方向量。通过三角形相邻两条边的叉积来求得。A点的法线公式:
p1 = pos2-pos1;
p2 = pos3-pos1;
N = (p1.y * p2.z - p1.z*p2.y , p1.z*p2.x-p1.x*p2.z , p1.x * p2.y - p1.y*p2.x)
顶点次法线(binormal)
也叫副法线,他是与该顶点相切的一条切向量。
顶点切线(tangent)
他是另一条与顶点相切的切向量。他与顶点法线、顶点次法线、顶点切线构成一个切线空间。
顶点切线是这个空间的X轴,顶点次法线是这个空间的Y轴,顶点法线是Z轴。这三个轴就构成了某个点的切线空间。另外次法线和切线还可以这样理解:
切空间下的x轴和y轴就是顶点所在uv坐标系下的u轴和v轴

这样是不是更易理解了。
顶点A的次法线和顶点切线的公式如下:
p1 = pos2-pos1;
p2 = pos3-pos1;
s1 = uv2 - uv1;
s2 = uv3 - uv1;
float t = 1.0f / (s1.x * s2.y - s1.y*s2.x);
Tangent = (p1 * s2.y - p2 * s1.y) * t;
Binormal = (p2*s1.x - p1 * s2.x) * t;
B点和C点的切线和次法线也是这样计算的。这三组法线就构成了一个切线空间矩阵TBN。
这个TBN可是非常有用的,在凹凸纹理的各种实现方法中都用到他。

你可能感兴趣的:(Unity-Shader切线空间)