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可是非常有用的,在凹凸纹理的各种实现方法中都用到他。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值