Unity Shader入门精要 第4章 法线变换 读书笔记

时间:2024-04-13 14:36:08

第4章 学习Shader所需的数学基础-法线变换

注意:图片的来源基本来自作者冯乐乐的GitHub,感谢作者分享

https://github.com/candycat1992/Unity_Shaders_Book

 

特殊的变换:法线变换

法线(normal):法矢量。需要特殊处理的方向矢量。

 

模型的顶点会携带额外的信息,顶点法线是其中的一种信息。

变换一个模型的时候,不仅需要变换它的顶点,还需要变换顶点法线,以便于后续处理(片元着色器)中计算光照等。

 

一般来说,点 和 绝大部分方向矢量 都可以使用 同一个 4×4 或者 3×3 的变换矩阵,把其从 坐标空间A 变换到 坐标空间B 中。但是在变换法线的时候如果使用同一个变换矩阵,可能就无法确保维持法线的垂直性。

 

切线(切矢量):方向矢量。

切线往往是模型顶点携带的一种信息。通常于纹理空间对齐,而且与法线方向垂直。

顶点的切线和法线互相垂直。

Unity Shader入门精要 第4章 法线变换 读书笔记

切线是由两个顶点之间的差值计算得到的,因此可以直接使用用于变换顶点的变换矩阵来变换切线。

假设只用 3×3的变换矩阵 M 来变换顶点,将其从坐标空间A 变换到 坐标空间B(注意这里涉及到的变换矩阵都是 3×3的矩阵,不考虑平移变换,这是因为切线和法线都是方向矢量,不会受平移影响

 

求得变换后的切线:

Unity Shader入门精要 第4章 法线变换 读书笔记

进行非统一缩放时,如果使用和变换顶点相同的变换矩阵来变换法线,就会得到错误的结果,即变换后的法线方向与平面不再垂直 

Unity Shader入门精要 第4章 法线变换 读书笔记

由数学约束条件推导 法线变换矩阵:

 

1、

已知同一个顶点的切线

Unity Shader入门精要 第4章 法线变换 读书笔记

和法线

Unity Shader入门精要 第4章 法线变换 读书笔记

必须满足垂直条件,即:

Unity Shader入门精要 第4章 法线变换 读书笔记

 

2、

Unity Shader入门精要 第4章 法线变换 读书笔记

 

3、

求 法线变换矩阵G,使得 变换后的法线 仍然与 变换后的切线 垂直:

Unity Shader入门精要 第4章 法线变换 读书笔记

 

注意:如果变换矩阵

Unity Shader入门精要 第4章 法线变换 读书笔记

是正交矩阵,那么:

Unity Shader入门精要 第4章 法线变换 读书笔记

因此:

Unity Shader入门精要 第4章 法线变换 读书笔记

 

也就是说:

1、如果变换矩阵是正交矩阵,那么可以使用用于变换顶点的变换矩阵来直接变换法线。

2、如果变换只是包括旋转变换,那么这个变换矩阵就是正交矩阵

3、如果变换只包含旋转和统一缩放,而不包含非统一缩放,那就可以利用统一缩放系数(k)来得到变换矩阵的逆转置矩阵(避免了计算逆矩阵的过程):

Unity Shader入门精要 第4章 法线变换 读书笔记

4、如果变换中包含了非统一变换,那么就必须通过 求解逆矩阵 来得到 变换法线的矩阵