Unity Shader 从未入门到已放弃(一)--基础
以此开始记录和总结一下学习仙德尔的情况。
数学篇
矩阵是非常重要的一项数学知识,我们需要通过矩阵来计算平移、缩放、旋转等变换,更需要通过矩阵在不同的坐标空间中进行变换。为何又需要那么多的坐标空间呢?因为我们需要在不同的情况下使用不同的坐标,因为一些特定的概念只有在特定的空间坐标系下才有意义,才更容易理解。比如,你描述门的位置,是将坐标放在房间里,你描述你耳朵的位置,就需要将坐标放在脸上。
因为有不同的坐标空间存在,所以我们需要进行不同坐标空间的转换。
举例说明:有一个父坐标空间P,一个子坐标空间C。我们知道父坐标空间中子坐标空间的原点位置以及三个单位坐标轴。我们通常会有两种需求,一种是把子坐标空间下的点或矢量转到父坐标空间下的表示
,另一个需求则是反过来。我们可以用以下公式来表示:
=
=
表示从子坐标空间变换到父坐标空间的变换矩阵,
为其逆矩阵。现在我们已知C的三个坐标轴在P下表示
,
,
,以及其原始位置
,当给定一个子坐标空间中的一点
=(a,b,c),则可以通过计算得
=
+a
+b
+c
,再按列展开并扩展到齐次坐标空间中
所以,最后就可以得到:
然后,我们还可以从这个转换矩阵中得到很多有用的信息以及推导:
因为矢量是没有位置的,原点的信息可以忽略掉,即可以得到一个3X3的矩阵,因为我们不需要表示平移变换,那么变换矩阵就是:
在shader中,我们常常会看到截取变换矩阵的前三行前三列来对法线方向,光照方向来进行空间变换,这正是原因所在。
特殊的
3X3与4X4矩阵的选择