赞
踩
在学习 Unity的Shader时,发现 unity Shader内置了一个宏定义
- // Declares 3x3 matrix 'rotation', filled with tangent space basis
- #define TANGENT_SPACE_ROTATION \
- float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w; \
- float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal )
假设线性子空间的基B={v1,v2,...,vk}, 向量 a = v1c1+v2c2+...+vkck,那么(c1,c2,...,ck)即为a基于B的坐标。换句话说,坐标是向量在某组基下的表示。此时,我们称B定义了一个坐标系。假设向量a在基{v1,v2,vk}下的坐标已知为b,矩阵C={v1,v2...vk},那么有 a = Cb,C就是这个坐标变换的变换矩阵。
现在我们来看切空间的三个轴,它其实就是一组正交的基 {v1,v2,v3} , 任何一个切空间的坐标b (xb,yb,zb)与之相乘,都可以转化为模型空间的坐标a (xa,ya,za),即a = Cb。
展开写就是
|xa| |v.tangent.x, binormal.x, v.normal.x| |xb|
|ya| = |v.tangent.y, binormal.y, v.normal.y| * |yb|
|za| |v.tangent.z, binormal.z, v.normal.z| |zb|
因此,上面的变换矩阵就是一个从切空间到模型空间的变换矩阵,那么从模型空间到切空间的变换矩阵就是上面矩阵的逆矩阵。又因为这个矩阵是一个正交矩阵,因此它的逆矩阵可以写成它的转置矩阵。
一旦转置,就出现了最开始的那段代码。
- float3x3( v.tangent.xyz,
- binormal,
- v.normal )
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。