24.Shader数学基础总结

24.Shader数学基础总结


24.1 知识点

总结


注意


24.2 核心要点速览

矩阵的基本概念

  1. 线性代数:研究向量与线性变换的数学分支,是 Shader 里坐标与变换的底座。
  2. 矩阵:由 (m) 行 (n) 列((m,n>0))构成的数表,既可编码线性变换,也可用数组承载数据。
  3. 在本系列中的目标:把矩阵当作 平移、旋转、缩放、空间链、投影 的统一语言,支撑顶点变换与裁剪。

速览对照

概念 思路 速记
矩阵 线性变换的数值编码 连续变换 = 矩阵相乘
数乘矩阵 每个元素乘同一标量
矩阵乘矩阵 左行点右列,(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);行/列为单位正交基

矩阵乘法

  1. 矩阵与标量:矩阵每个元素与标量 (k) 相乘。
  2. 矩阵与矩阵:左矩阵列数 = 右矩阵行数;结果为「左行数 × 右列数」;第 (i,j) 元 = 左第 (i) 行与右第 (j) 列对应相乘再求和。
  3. 运算律:一般 不满足交换律满足结合律——顺序即语义,复合变换不能随意对调。

特殊矩阵

  1. 方阵:行数列数相等。
  2. 对角矩阵:非主对角元为 0。
  3. **单位矩阵 I**:主对角全 1 的对角阵,乘上它等于「不变换」。
  4. 数量矩阵:主对角为同一常数的对角阵。
  5. 转置:行列互换;有 ((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 常用:NearFar、竖直 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/图形学里常把复合模型变换约定为 先缩放、再旋转、后平移?若改成先平移再旋转,几何上可能出什么问题?

深入解析
  • 先缩放再旋转:旋转作用在 局部主轴已对齐、尺度已统一 的模型上,与在建模空间调 scalerotate 的直觉一致。若 先旋转再缩放,缩放会沿 世界系或已倾斜的轴 作用,局部「只拉某一轴」的语义易乱。
  • 平移 表示物体在场景中的摆放,通常希望 最后 放到世界位置;若先平移再绕原点旋转,等价于绕世界原点「甩」物体,与「绕自身枢轴旋转」的常见需求不一致。
  • 矩阵乘法 不交换,顺序即语义,选 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

×

喜欢就点赞,疼爱就打赏