24.Shader数学基础总结
24.1 知识点

总结


注意

24.2 核心要点速览
矩阵的基本概念
- 线性代数:研究向量与线性变换的数学分支,是 Shader 里坐标与变换的底座。
- 矩阵:由 (m) 行 (n) 列((m,n>0))构成的数表,既可编码线性变换,也可用数组承载数据。
- 在本系列中的目标:把矩阵当作 平移、旋转、缩放、空间链、投影 的统一语言,支撑顶点变换与裁剪。
速览对照:
| 概念 | 思路 | 速记 |
|---|---|---|
| 矩阵 | 线性变换的数值编码 | 连续变换 = 矩阵相乘 |
| 数乘矩阵 | 每个元素乘同一标量 | — |
| 矩阵乘矩阵 | 左行点右列,(m×k)(k×n)→(m×n) |
不满足交换律;满足结合律 |
| 特殊阵 | 方阵、对角、单位 I、数量阵 |
单位阵像「不做事」 |
| 转置 | 行列互换 | (AB)^T = B^T A^T |
| 逆 | 「撤销」变换;需方阵且 (\det \neq 0) | (AB)^{-1}=B^{-1}A^{-1};M^{-1}(Mv)=v |
| 正交阵 | R^T R = I |
旋转典型;R^{-1}=R^T;行列式为 (\pm 1);行/列为单位正交基 |
矩阵乘法
- 矩阵与标量:矩阵每个元素与标量 (k) 相乘。
- 矩阵与矩阵:左矩阵列数 = 右矩阵行数;结果为「左行数 × 右列数」;第
(i,j)元 = 左第 (i) 行与右第 (j) 列对应相乘再求和。 - 运算律:一般 不满足交换律,满足结合律——顺序即语义,复合变换不能随意对调。
特殊矩阵
- 方阵:行数列数相等。
- 对角矩阵:非主对角元为 0。
- **单位矩阵
I**:主对角全 1 的对角阵,乘上它等于「不变换」。 - 数量矩阵:主对角为同一常数的对角阵。
- 转置:行列互换;有 ((A^T)^T=A),以及 ((AB)^T=B^T A^T)(串接转置 = 反向串接各转置)。
逆矩阵
存在前提:方阵且 行列式不为 0;(\det=0) 则不可逆。
手工求逆脉络(理解用,工程上多用库):验方阵 → 算行列式 → 代数余子式(子式行列式乘 ((-1)^{i+j}))→ 伴随矩阵(代数余子式矩阵的转置)→ (A^{-1} = \frac{1}{\det(A)},\mathrm{adj}(A))。
常用性质:逆的逆为自身;(AA^{-1}=A^{-1}A=I);(I^{-1}=I);((A^T)^{-1}=(A^{-1})^T);((AB)^{-1}=B^{-1}A^{-1}),多矩阵连乘则逆为 逆矩阵反向串接;几何上 (M^{-1}(Mv)=v),即先变换再逆变换回到原向量。
正交矩阵
- 定义:方阵 (M) 满足 (M^T M = M M^T = I)。
- 性质:(M^T) 仍为正交;(M^{-1}=M^T);(\det(M)=\pm 1);各行、各列均为 单位向量 且 两两正交(一组标准正交基)。
列矩阵、行矩阵与 Unity 约定
- 列矩阵 / 行矩阵:单列或单行,常用来存向量;与矩阵相乘时 左乘列 与 右乘行 形式不同,不能混用同一套式子。
- Unity Shader:采用 列向量左乘,结合律下 从右往左读:(CBAv = C(B(Av))),先算 (Av),再依次左乘。
- 行向量等价写法:要与列形式得到同一几何结果,可对各变换矩阵取转置后右乘:(v A^T B^T C^T)。
矩阵的几何意义
矩阵在图形学里可视作 对点或向量施加的变换:平移、旋转、缩放、空间换基与投影等,都可纳入矩阵运算;Shader 中顶点数据沿管线变换,本质是在不同空间下用矩阵 重写同一几何对象。
齐次坐标
把 (n) 维点/向量用 (n+1) 维表示。意义:
- 区分点与向量(配合 (w) 的取值);
- 把平移写进矩阵(纯 (3\times3) 无法表示平移,(4\times4) 可以)。
4×4 变换矩阵与平移
结构:左上 3×3 承载旋转与缩放;第 4 列前 3 行为平移 ((t_x,t_y,t_z));底行固定 [0,0,0,1],保证齐次运算封闭。
平移矩阵与 逆(逆 = 平移量取反):
1 0 0 tx 1 0 0 -tx
0 1 0 ty 0 1 0 -ty
0 0 1 tz 0 0 1 -tz
0 0 0 1 0 0 0 1
- 点((w=1)):平移项参与计算,位置移动。
- 方向向量((w=0)):平移被消掉,只受左上
3×3影响,符合「平移不改变方向」的语义。
平移矩阵 不是 正交矩阵(一般 (M^T \neq M^{-1}))。
旋转矩阵
3×3(嵌入 4×4 时右下为 1),绕轴转角 (\beta)(记忆:绕谁谁对应一行/列像单位阵):
绕 X:
[1 0 0 ]
[0 cosβ -sinβ ]
[0 sinβ cosβ ]
绕 Y:
[cosβ 0 sinβ ]
[0 1 0 ]
[-sinβ 0 cosβ ]
绕 Z:
[cosβ -sinβ 0 ]
[sinβ cosβ 0 ]
[0 0 1 ]
与点或向量相乘时,几何上绕对应轴旋转 (\beta)。旋转矩阵是 正交矩阵,转置 = 逆,用于「旋回去」。
缩放矩阵
4×4 对角形式 (\mathrm{diag}(k_x,k_y,k_z,1)):
[ kx 0 0 0 ]
[ 0 ky 0 0 ]
[ 0 0 kz 0 ]
[ 0 0 0 1 ]
- 统一缩放:(k_x=k_y=k_z)。
- 非统一缩放:各轴比例不全相等。
点与向量(齐次下 (w) 为 0 或 1)都会按各轴比例改变长度;逆矩阵为各轴取倒数 (\mathrm{diag}(1/k_x,1/k_y,1/k_z,1))。一般 不是 正交矩阵。
矩阵的复合运算
定义:多个单步变换矩阵连乘,得到一步到位的复合变换。因 不满足交换律,顺序不同结果可以完全不同(可类比「先拧瓶盖再倒热水」与顺序对调)。
Unity 常用约定:先缩放 → 再旋转 → 后平移(TRS),与「局部尺度 → 朝向 → 摆到世界位置」的直觉一致;复合欧拉旋转顺序系列中为 Z → X → Y(先绕 Z,再 X,最后 Y)。
坐标空间与变换链
坐标空间:由 原点 与 三根坐标轴 确定;不同空间服务于不同问题(建模、场景、相机、裁剪、像素)。
渲染空间链(数据从哪来到哪去):
| 顺序 | 空间 | 作用(一句话) |
|---|---|---|
| 1 | 模型空间 | 相对模型原点与轴向的顶点 |
| 2 | 世界空间 | 场景统一坐标 |
| 3 | 观察空间 | 以摄像机为参考 |
| 4 | 裁剪空间 | 齐次下视锥裁剪、透视除法 |
| 5 | 屏幕空间 | 像素与深度相关量 |
管线中通过矩阵把坐标 从一种基的表示换到另一种,得到同一点在各空间中的数值。
子空间 ↔ 父空间矩阵
多数空间可看成某 父空间 的 子空间。
- 子 → 父 (M_{s\to f}):前三列为子空间三轴在父空间中的方向(可含缩放改变长度);第四列为子原点在父空间中的位置;底行
[0,0,0,1]。 - 父 → 子:(M_{f\to s} = M_{s\to f}^{-1})。
模型 → 世界:把建模坐标「摆进场景」。世界 → 观察:站在相机系里重写世界坐标。二者都是 换基与原点,不是换几何物体。
模型空间变换
方便建模:顶点默认相对模型自身原点与轴。模型空间变换即把模型系下的点/向量变到世界系。
- 思路一:若初始模型系与世界系重合,物体发生的缩放、旋转、平移同步作用到顶点上。
- 思路二:按上节规则构造 (M_{s\to f});有缩放时,轴方向向量可按各轴缩放因子伸缩后填入列。
观察空间变换
观察空间可理解为 摄像机的模型空间,决定视角与可见范围。
观察变换:世界空间 → 观察空间(管线第二步)。实现上可 按子父矩阵规则 构造 (M_{\text{世界}\to\text{观察}}),或通过 把相机系与世界系对齐的逆过程 得到等价表达。
裁剪空间与视锥
视锥体:相机可见的 3D 区域,外侧几何被裁掉。
齐次裁剪空间:把视锥映到规范区域(如标准立方体),使裁剪判断 形式统一。
投影方式:
- 透视:顶点与相机连线与 近裁剪面 的交点——近大远小。
- 正交:沿平行于侧裁剪面的方向投到近裁剪面——无透视收缩,类似工程图。
相似三角形(透视推导常用):对应角相等,对应边成比例,比例记为相似比 (k)。
正交投影矩阵要点
目标:观察空间下的正交视域 → 齐次裁剪空间。Unity 常用量:
Size:视锥 竖直半高;高度 (2\cdot\text{Size}),宽度 (\text{Aspect}\cdot 2\cdot\text{Size})(Aspect= 宽/高)。Near/Far:近、远裁剪面到相机距离。
推导脉络:先把视锥 平移 使中心对齐原点,再 缩放 将 xy 映到约 [-1,1](与原文「平移中心 + 缩放进盒子」一致)。
透视投影矩阵要点
目标:透视视锥 → 齐次裁剪空间。Unity 常用:Near、Far、竖直 FOV。近裁剪面:
\[
h_{\text{near}} = 2\cdot\text{Near}\cdot\tan\left(\frac{\text{FOV}}{2}\right),\quad
w_{\text{near}} = \text{Aspect}\cdot h_{\text{near}}
\]
远裁剪面同理,将 Near 换为 Far。
推导脉络:锥体 挤压 成长方体 → 平移 中心到原点 → 缩放 xy 到约 [-1,1],与速览中「挤盒—平移—标准化」一致。
裁剪判定
统一到裁剪空间后:
- 正交:常判 (x,y,z \in [-1,1])。
- 透视:在齐次下用 (w),满足 (-w \le x,y,z \le w) 的顶点保留;与后续 透视除法 后落到 NDC 的关系密切(正交时 (w) 多为常数,退化为固定盒)。
屏幕空间
裁剪坐标经 透视除法 后,按视口映射到像素:
\[
X_s = \dfrac{\text{Width} \cdot X_{clip}}{2 \cdot W_{clip}} + \dfrac{\text{Width}}{2},\quad
Y_s = \dfrac{\text{Height} \cdot Y_{clip}}{2 \cdot W_{clip}} + \dfrac{\text{Height}}{2}
\]
Z_clip 进入深度缓冲(编码方式因平台而异);W_clip 参与透视除法与 透视校正插值 等后续计算。
24.3 面试题精选
基础题
1. 齐次坐标里点的 w=1 与向量的 w=0
题目
在 Shader 常用的四维齐次表示中,为什么 点 常取 (w=1)、方向向量 常取 (w=0)?与平移矩阵相乘时分别发生什么?
深入解析
- 点((w=1)):平移矩阵第四列的平移量会参与累加,因此 位置会随平移改变。
- 向量((w=0)):平移项与 0 相乘后不进入前三维,故 向量不受平移影响,只保留旋转/缩放(由左上 (3\times3) 子块决定),符合「方向与长度不应因平移而变」的几何语义。
- 区分点与向量 是齐次坐标在图形学中的核心用途之一。
答题示例
点用 (w=1) 是为了让平移矩阵的平移分量加在坐标上,位置会动。
向量表示方向,用 (w=0) 时平移那一列乘不到结果里,向量只做旋转缩放、不会被平移拖走。
这样同一套 (4\times4) 矩阵既能变换点又能正确处理向量。
参考文章
- 9.平移旋转缩放变换-齐次坐标
- 10.平移旋转缩放变换-平移矩阵
2. Unity Shader 中列向量与 (CBAv) 的阅读顺序
题目
Unity 中常用 列向量 左乘矩阵。对表达式 (CBAv),应如何理解运算顺序?与「先缩放、再旋转、后平移」的复合变换如何对应?
深入解析
- 列向量约定下,(CBAv = C(B(Av))),即 从右向左 先算 (Av),再套 (B)、再套 (C)。
- 若 (A,B,C) 分别对应缩放、旋转、平移(具体赋值顺序与矩阵定义一致时),则 最靠右的矩阵最先作用到向量上,与「先 S 再 R 再 T」的约定在矩阵写法上需一致(通常将 缩放、旋转写在左侧链、平移靠最后一次左乘,与引擎提供的
MVP连乘顺序对照记忆)。 - 与 行向量右乘转置 (v^\top A^\top B^\top C^\top) 数学上等价,只是形式不同。
答题示例
Unity 用列向量时,(CBAv) 要先算最右边的 (Av),再 (B),再 (C),也就是从右往左结合。
复合变换在代码里写成一串矩阵相乘时,顺序要和「先作用谁」对齐;行向量写法要改成转置形式才能对齐同一几何结果。
参考文章
- 7.特殊矩阵-列矩阵和行矩阵
- 13.平移旋转缩放变换-复合运算
进阶题
1. 旋转矩阵与正交矩阵
题目
说明 旋转矩阵 为什么是正交矩阵,以及为何可用 转置 代替 求逆 撤销一次旋转?
深入解析
- 旋转保持向量长度与夹角,其列(或行)为 两两正交的单位向量,故满足 (R^\top R = I),即 正交矩阵。
- 正交矩阵有 (R^{-1} = R^\top),数值上 转置比求逆便宜且稳定。
- 撤销旋转:对列向量左乘 (R^\top) 即可。
答题示例
旋转只改变方向、不改变长度,矩阵的列是互相垂直的单位向量,所以满足转置乘自己等于单位阵,是正交矩阵。
正交矩阵的逆等于转置,所以撤销旋转不用求逆,转置一下就行,算起来更简单。
参考文章
- 6.特殊矩阵-正交矩阵
- 11.平移旋转缩放变换-旋转矩阵
2. 复合变换为何常用 S → R → T
题目
为何 Unity/图形学里常把复合模型变换约定为 先缩放、再旋转、后平移?若改成先平移再旋转,几何上可能出什么问题?
深入解析
- 先缩放再旋转:旋转作用在 局部主轴已对齐、尺度已统一 的模型上,与在建模空间调
scale再rotate的直觉一致。若 先旋转再缩放,缩放会沿 世界系或已倾斜的轴 作用,局部「只拉某一轴」的语义易乱。 - 平移 表示物体在场景中的摆放,通常希望 最后 放到世界位置;若先平移再绕原点旋转,等价于绕世界原点「甩」物体,与「绕自身枢轴旋转」的常见需求不一致。
- 矩阵乘法 不交换,顺序即语义,选 S→R→T 与美术「局部缩放→转向→摆位置」一致。
答题示例
缩放会改变几何尺寸和旋转中心的感觉,所以一般先缩放再旋转,旋转作用在统一尺度上。
平移放在最后表示把物体摆到世界里的位置;若先平移再绕原点转,会变成绕世界原点转,而不是绕模型自己转。
矩阵顺序不能乱换,换了结果就变。
参考文章
- 13.平移旋转缩放变换-复合运算
- 8.平移旋转缩放变换-矩阵的几何意义
深度题
1. 透视裁剪为何用 (w) 界定范围
题目
正交投影下裁剪常用 (x,y,z \in [-1,1])。透视投影下为何用 ( -w \le x,y,z \le w )?与透视除法有什么关系?
深入解析
- 透视投影矩阵会把 深度与透视锥信息编码进 (w),裁剪阶段仍在 齐次坐标 下判断;不等式在 除以 (w) 后对应视锥内的标准化区域。
- 使用 (w) 界定使得 同一套裁剪逻辑 能处理近大远小与视锥斜面,再经硬件透视除法得到 NDC。
- 正交时通常 (w) 为常数,退化为固定盒裁剪。
答题示例
透视投影后齐次坐标的 (w) 不再恒为 1,里面带了深度和透视信息。
裁剪用 (-w) 到 (w) 是因为在除 (w) 之前就要判断在不在锥体内,除完才对应 NDC 里的标准范围。
正交投影 (w) 基本不变,就退化成在固定立方体里裁剪。
参考文章
- 21.坐标系变换-裁剪空间变换-透视投影
- 22.坐标系变换-裁剪空间变换-裁剪空间变换的意义
2. 子空间到父空间矩阵的列怎么读
题目
子空间到父空间的变换矩阵 (M_{s \to f}) 中,前三列与第四列分别承载什么几何含义?父到子为何是求逆?
深入解析
- 前三列:子空间 三根坐标轴 在父空间中的 方向向量(若含非统一缩放,列长一般不是 1)。
- 第四列:子空间 原点 在父空间中的 位置。
- 父到子是把同一向量用 子空间的基 重新表示,数学上是 逆变换,故 (M_{f\to s}=M_{s\to f}^{-1});仅当正交且单位缩放时逆与转置关系才特别简单。
答题示例
子到父矩阵前三列是子坐标轴在父空间里朝哪、多长,第四列是子原点在父空间的位置。
父到子等于把这个变换反过来,所以用逆矩阵;相当于把坐标从父系的表达换回子系的表达。
参考文章
- 15.坐标系变换-坐标空间的变换规则
- 14.坐标系变换-坐标空间的变换
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com