Shader着色器
面向GPU编程
矩阵
概念
以行列形式组织起来的矩形的数字块
维度和记法
n行m列矩阵,简称n x m矩阵
元素的记法:假设矩阵M,M12为第1行第2列的元素
方阵
行数与列数相同的矩阵
2x2, 3x3, 4x4的矩阵
对角线元素
仅存在方阵中
方阵中行号与列号相同的元素就是对角线元素,其余都是非对角线元素
对角矩阵
方阵中,非对角线元素都为0的矩阵就是对角矩阵
单位矩阵
方阵中,对角线元素都为1,非对角线元素都为0的矩阵就是单位矩阵
如果一个矩阵是单位矩阵,那么它一定是对角矩阵
如果一个矩阵是对角矩阵,那么它可能是单位矩阵
矩阵和向量
向量记法
行向量:x, y, z
列向量:x,
y,
z
矩阵和向量的关系
行向量
一行三列的矩阵
列向量
三行一列的矩阵
转置矩阵
对于给定矩阵M,一定存在一个转置矩阵MT
将行变为列,列变为行
例如:2x3的矩阵,转置矩阵为3x2
矩阵运算
矩阵与标量的乘法
矩阵的每一个元素与标量相乘,不会改变矩阵的维度
矩阵 * 标量 = 矩阵
矩阵与矩阵的乘法
并不是所有的矩阵都能做乘法运算
M * N如果可以做乘法运算,那么必须满足M矩阵的列数与N矩阵的行数保持一致,否则M不能与N做乘法运算
矩阵 * 矩阵 = 矩阵
如果一个矩阵M(2 x 3),与矩阵N(3 x 4),那么M * N(2 x 4)
矩阵的乘法不满足乘法的交换律(交换律:A*B = B*A),M * N != N * M
公式
图解
矩阵与向量的乘法
向量与矩阵的乘法与矩阵与矩阵的乘法公式相同
行向量(1 x 3)需放在乘法的左侧与矩阵(3 x 3)进行运算,结果还是一个行向量(1 x 3):左乘
列向量(3 x 1)需放在乘法的右侧与矩阵(3 x 3)进行运算,结果还是一个列向量(3 x 1):右乘
向量与矩阵乘法的几何意义
假设向量a与矩阵M相乘得到的结果是向量b,aM=b。
如果矩阵来表示某种变换的话,那么就可以说向量a通过矩阵M表示的变换,变换后得到向量b
矩阵的几何意义
描述变换的(例如:旋转,缩放,平移,投影)
变换
线性变换
变换前是直线,变换后依旧是直线,变换前是原点,变换后依旧是原点的变换
旋转,缩放,投影,切变,镜像
平移不是线性变换
线性变换使用 3x3的矩阵就能描述3维空间的下的线性变换
仿射变换
线性变换 + 平移
对于平移来说,必须使用4x4的矩阵才能描述3维空间下的平移
矩阵的行列式
只有方阵才有行列式
行列式是一个标量,并不是矩阵
对于给定的矩阵M,它的行列式记为:|M| 或 detM
2阶行列式
3阶行列式
代数余子式
代数余子式是标量,并且一个矩阵代数余子式有多个,如果矩阵为 m行n列,那么代数余子式有 m*n个
记作: Cij
公式
代数余子式可以组成代数余子式矩阵
标准伴随矩阵(adjM)
是代数余子式矩阵的转置矩阵
逆矩阵(矩阵的逆)
记作:M-1
逆矩阵 = 标准伴随矩阵 / 矩阵的行列式
注意:并不是所有的矩阵都有逆矩阵,当矩阵的行列式为0时,该矩阵没有逆矩阵
计算步骤
1、计算矩阵的行列式detM,判断矩阵是否可逆
2、计算矩阵的代数余子式矩阵
3、通过代数余子式矩阵计算标准伴随矩阵adjM
4、求逆矩阵, adjM / detM
几何意义
A向量经过矩阵M的变换得到了向量B,向量B经过M矩阵的逆矩阵变换得到了向量A,那么矩阵M与矩阵M的逆矩阵描述的变换是相反的
对于矩阵M实现的变换,𝑀−1可以实现相反 的变换
假如:矩阵M可以将向量缩放2倍,那么矩阵M的逆矩阵可以将向量缩放0.5倍
旋转矩阵
绕X轴旋转θ度
行向量左乘矩阵
列向量右乘矩阵
例如:
绕Y轴旋转θ度
行向量左乘矩阵
列向量右乘矩阵
绕Z轴旋转θ度
行向量左乘矩阵
列向量右乘矩阵
缩放矩阵
沿坐标轴缩放的矩阵
缩放矩阵中,对角线元素描述了对每个轴的缩放,注意:缩放轴需要指定,缩放系数为1时,表示没有缩放
镜像矩阵
镜像简单理解就是左右翻转,上下翻转等
以yz组成的平面进行镜像
以xz组成的平面进行镜像
以xy组成的平面进行镜像
投影矩阵
所有的点都被拉平至垂直的轴或平面上, 这种投影方式叫做正交投影
投影是需要在一个平面上完成的,表示要 投影到哪个平面,所以我们计算都是根据 平面进行投影
3D变2D的过程就是投影
公式
齐次坐标
将3位向量(x,y,z)变为4维,增加一个w分量,(x, y, z, w)
使用4维向量来表示3维空间下的坐标点或方向向量
当w = 1时,(x, y, z)表示坐标点
当w = 0时,(x, y, z)表示方向向量
平移矩阵
对于向量平移是没有意义的,只有对坐标点平移才有意义
描述3维空间下的坐标点的平移需要使用4x4矩阵
3维向量在于平移矩阵做运算时,要使用其 齐次坐标来进行运算
推导平移公式
cs代码实现自定义平面网格