第4章 学习Shader所需的数学基础-法线变换
注意:图片的来源基本来自作者冯乐乐的GitHub,感谢作者分享
https://github.com/candycat1992/Unity_Shaders_Book
特殊的变换:法线变换
法线(normal):法矢量。需要特殊处理的方向矢量。
模型的顶点会携带额外的信息,顶点法线是其中的一种信息。
变换一个模型的时候,不仅需要变换它的顶点,还需要变换顶点法线,以便于后续处理(片元着色器)中计算光照等。
一般来说,点 和 绝大部分方向矢量 都可以使用 同一个 4×4 或者 3×3 的变换矩阵,把其从 坐标空间A 变换到 坐标空间B 中。但是在变换法线的时候如果使用同一个变换矩阵,可能就无法确保维持法线的垂直性。
切线(切矢量):方向矢量。
切线往往是模型顶点携带的一种信息。通常于纹理空间对齐,而且与法线方向垂直。
顶点的切线和法线互相垂直。
切线是由两个顶点之间的差值计算得到的,因此可以直接使用用于变换顶点的变换矩阵来变换切线。
假设只用 3×3的变换矩阵 M 来变换顶点,将其从坐标空间A 变换到 坐标空间B(注意这里涉及到的变换矩阵都是 3×3的矩阵,不考虑平移变换,这是因为切线和法线都是方向矢量,不会受平移影响)
求得变换后的切线:
进行非统一缩放时,如果使用和变换顶点相同的变换矩阵来变换法线,就会得到错误的结果,即变换后的法线方向与平面不再垂直
由数学约束条件推导 法线变换矩阵:
1、
已知同一个顶点的切线
和法线
必须满足垂直条件,即:
2、
3、
求 法线变换矩阵G,使得 变换后的法线 仍然与 变换后的切线 垂直:
注意:如果变换矩阵
是正交矩阵,那么:
因此:
也就是说:
1、如果变换矩阵是正交矩阵,那么可以使用用于变换顶点的变换矩阵来直接变换法线。
2、如果变换只是包括旋转变换,那么这个变换矩阵就是正交矩阵
3、如果变换只包含旋转和统一缩放,而不包含非统一缩放,那就可以利用统一缩放系数(k)来得到变换矩阵的逆转置矩阵(避免了计算逆矩阵的过程):
4、如果变换中包含了非统一变换,那么就必须通过 求解逆矩阵 来得到 变换法线的矩阵