从零一起读_UnityShaderLab_03_矩阵(下)

186 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

作为一名优秀的开发者,对于技术的探求应该是永无止步的,如何让自己更进步,那就只有不停的学习,不停的充电.而这些都都是说起来容易做起来难,坚持才是难的地方 --蛙哈哈

如果我能更新完这一系列,我希望掘金能给我颁发一个劳模奖.

1.4矩阵运算

1.4.1 标量与矩阵相乘

与向量类似,矩阵也可以和标量相乘,中间不需要写运算符号,相乘之后的结果与原矩阵的维数相同,然后将每个分量乘上这个标量.

kM=k[m11m12m13m21m22m23m31m32m33]=[km11km12km13km21km22km23km31km32km33]kM = k \begin{bmatrix} m_{11} &m_{12}&m_{13}\\ m_{21}&m_{22}&m_{23}\\ m_{31}&m_{32}&m_{33}\\ \end{bmatrix} = \begin{bmatrix} km_{11} &km_{12}&km_{13}\\ km_{21}&km_{22}&km_{23}\\ km_{31}&km_{32}&km_{33}\\ \end{bmatrix}

1.4.2 矩阵与矩阵相乘

只有在某些特定的情况下,矩阵与矩阵之间才能相乘,并且结果还是矩阵,这种情况是:

第一个矩阵的列数等于第二个矩阵的行数,这两个矩阵才可以相乘,得到的矩阵的行数等于第一个矩阵的行数,列数等于第二个矩阵的列数.

例如: 3 X 2 的矩阵 A 和 2 X 3 的矩阵 B 相乘的结果是一个 3 X 3的矩阵.

[??????][??????]=[?????????]\begin{bmatrix} ?&?\\ ?&?\\ ?&?\\ \end{bmatrix}\begin{bmatrix} ?&?&?\\ ?&?&?\\ \end{bmatrix} = \begin{bmatrix} ?&?&?\\ ?&?&?\\ ?&?&?\\ \end{bmatrix}

假设有 r X n 的矩阵 A 和 n X c 的矩阵 B ,相乘之后的到的 r X c的矩阵 C C 的任意分量Cij 等于 A 的第 i 行的向量 点乘 B 的第 j列的向量.

1.4.3 矩阵与向量相乘

在 Shader 中,向量也可以与矩阵相乘,相乘的时候,可以把向量看成行数为1或者列数为1的矩阵.

[xyz][xyz]\begin{bmatrix} x&y&z \end{bmatrix} \begin{bmatrix} x\\y\\z \end{bmatrix}

向量与矩阵相乘的几何意义是实现向量的空间转换(后面会介绍).

因为向量和矩阵相乘的前提是把向量看成一个矩阵,所以也要满足矩阵相乘的规则.

1.行向量左乘矩阵

[xyz][m11m12m13m21m22m23m31m32m33]=[xm11+ym21+zm31xm12+ym22+zm32xm13+ym23+zm33]\begin{bmatrix} x&y&z \end{bmatrix} \begin{bmatrix} m_{11} &m_{12}&m_{13}\\ m_{21}&m_{22}&m_{23}\\ m_{31}&m_{32}&m_{33}\\ \end{bmatrix} = \begin{bmatrix} xm_{11}+ ym_{21} +zm_{31}&xm_{12}+ ym_{22} +zm_{32}&xm_{13}+ ym_{23} +zm_{33} \end{bmatrix}

2.行向量右乘矩阵

[m11m12m13m21m22m23m31m32m33][xyz]\begin{bmatrix} m_{11} &m_{12}&m_{13}\\ m_{21}&m_{22}&m_{23}\\ m_{31}&m_{32}&m_{33}\\ \end{bmatrix}\begin{bmatrix} x&y&z \end{bmatrix}

不满足矩阵线相乘的规则,没有意义.

3.列向量左乘矩阵

[xyz][m11m12m13m21m22m23m31m32m33]\begin{bmatrix} x\\y\\z \end{bmatrix}\begin{bmatrix} m_{11} &m_{12}&m_{13}\\ m_{21}&m_{22}&m_{23}\\ m_{31}&m_{32}&m_{33}\\ \end{bmatrix}

不满足矩阵线相乘的规则,没有意义.

4.列向量右乘矩阵

[m11m12m13m21m22m23m31m32m33][xyz]=[xm11ym12zm13xm21ym22zm23xm31ym32zm33]\begin{bmatrix} m_{11}&m_{12}&m_{13}\\ m_{21}&m_{22}&m_{23}\\ m_{31}&m_{32}&m_{33}\\ \end{bmatrix}\begin{bmatrix} x\\y\\z \end{bmatrix} = \begin{bmatrix} xm_{11}&ym_{12}&zm_{13}\\ xm_{21}&ym_{22}&zm_{23}\\ xm_{31}&ym_{32}&zm_{33}\\ \end{bmatrix}

所以通过示例可以得出以下结论:

行向量左乘矩阵,所得结果依旧是行向量

列向量右乘矩阵,所得结果依旧是列向量