24.Shader数学基础总结
24.1 知识点
总结
注意
24.2 核心要点速览
矩阵的基本概念
- 线性代数:研究向量和变换的数学学科;
- 矩阵:由 ( m ) 行 ( n ) 列(( m、n>0 ))数值表格组成的数学工具,可通过数组表示数据;
- 学习矩阵的目的:支撑 Shader 开发中的数学计算。
矩阵乘法
矩阵与标量的乘法:
计算规则为:矩阵(M)中 每一个标量 直接与标量(k)相乘。矩阵与矩阵的乘法:
- 判断条件:左矩阵的 列数 与右矩阵的 行数 相等(左列右行相等);
- 结果矩阵结构:左矩阵的 行数 × 右矩阵的 列数(左行右列);
- 标量计算规则:左矩阵的行元素与右矩阵的列元素 对应相乘后求和;
- 运算律:不满足交换律,但 满足结合律。
特殊矩阵
- 方块矩阵:行列数相等的矩阵;
- 对角矩阵:仅主对角线有值、其余元素全为零的方阵;
- 单位矩阵:主对角线上元素均为1的对角矩阵;
- 数量矩阵:主对角线上元素为同一值的对角矩阵;
- 转置矩阵:互换原始矩阵的行和列得到的新矩阵,满足:
- 转置的转置等于原矩阵;
- 矩阵串接的转置等于反向串接各矩阵的转置(如 (AB) 的转置为 (B) 的转置接 (A) 的转置)。
逆矩阵
存在性与计算流程
- 存在前提:矩阵是方阵(行列数相等),且 行列式≠0(行列式为0则不可逆);
- 计算步骤:
- 验证矩阵是方阵(行列数相同);
- 计算矩阵行列式(值为0则无逆矩阵);
- 构造代数余子式矩阵:对第 (i) 行、第 (j) 列元素,取“去掉第 (i) 行、第 (j) 列的子式行列式”,再乘 ((-1)^{i+j});
- 推导标准伴随矩阵:将代数余子式矩阵转置;
- 计算逆矩阵:用标准伴随矩阵除以行列式(行列式非零前提下)。
运算性质
- 逆的逆是原矩阵:逆矩阵的逆矩阵,等于原矩阵本身;
- 矩阵与逆相乘为单位矩阵:矩阵和其逆矩阵相乘(无论顺序),结果都是单位矩阵(记为 (I));
- 单位矩阵的逆是自身:单位矩阵 (I) 的逆矩阵,就是它自己;
- 转置的逆等于逆的转置:转置矩阵的逆矩阵,等于原矩阵逆矩阵的转置;
- 串接矩阵的逆=反向串接逆矩阵:
- 两矩阵 (AB):其逆为 (B) 的逆接 (A) 的逆(即 ((AB)^{-1} = B^{-1}A^{-1}));
- 多矩阵 (ABCD):其逆为 (D) 的逆、(C) 的逆、(B) 的逆、(A) 的逆依次串接(即 ((ABCD)^{-1} = D^{-1}C^{-1}B^{-1}A^{-1}));
- 反向变换应用:对向量 (v),先经矩阵 (M) 变换,再经 (M) 的逆矩阵变换,结果与单位矩阵 (I) 变换 (v) 一致(即 (M^{-1}(Mv) = Iv = v))。
正交矩阵
- 定义:正交矩阵是方阵,它和它的转置矩阵相乘,结果为单位矩阵(如 ( M^T M = I ) 或 ( M M^T = I ),( I ) 代表单位矩阵)。
- 核心性质(设正交矩阵为 ( M )):
- ( M ) 的转置矩阵 ( M^T ) 也是正交矩阵;
- ( M ) 的转置矩阵 ( M^T ) 等于 ( M ) 的逆矩阵(即 ( M^T = M^{-1} ));
- ( M ) 的行列式值为 1 或 -1;
- ( M ) 的每一行都是单位向量,且行与行之间彼此正交(垂直);
- ( M ) 的每一列都是单位向量,且列与列之间彼此正交(垂直)。
列矩阵与行矩阵
基本概念
- 列矩阵:只有一列的矩阵;
- 行矩阵:只有一行的矩阵;
- 用途:二者一般用于表示向量;
- 运算差异:把向量作为列矩阵或行矩阵与其他矩阵相乘时,计算顺序(列在后、行在前)和结果不同。
Unity中的使用规则
- 计算形式:在Unity的Shader开发中,采用列矩阵的形式进行向量计算,利用结合律,可从右往左阅读计算(如 ( CBAv = C(B(Av)) ) ,先算 ( Av ) ,再依次左乘 );
- 行矩阵适配:若要用行矩阵计算出和列矩阵相同的结果,可乘以变换矩阵的转置矩阵(如 ( vA^T B^T C^T = ((vA^T)B^T)C^T ) )。
矩阵的几何意义
矩阵的可视化结果是 变换:在游戏开发中,矩阵可看作“平移、旋转、缩放”等变换的数学表达。若要对点或向量施加平移、旋转、缩放等变换,可通过矩阵的数学计算达成目的。
借助矩阵相关知识,能对 三维空间的向量 进行 平移、旋转、缩放、坐标变换、投影 等计算;通过这些计算,可精准处理 Shader 中的数据,让最终屏幕呈现效果符合设计需求。
齐次坐标
基本概念
齐次坐标是把原本 n维的向量或矩阵,用 n+1维 的形式来表示。
应用意义
采用齐次坐标进行矩阵运算,原因在于:
- 区分向量和点:借助齐次坐标的表达形式,能明确区分几何里的向量和点;
- 表示平移变换:齐次坐标可通过矩阵运算,直接实现平移变换(普通n维坐标的矩阵运算,难以体现平移效果)。
平移矩阵
1. 基础变换矩阵的构成规则
基础变换矩阵为 4×4矩阵,结构划分:
- 左上 3×3区域:承载旋转、缩放等变换逻辑;
- 右侧 第4列前3行:对应x、y、z方向的平移分量;
- 底部 第4行:固定为
[0, 0, 0, 1]
,保障齐次坐标运算一致性。
2. 平移矩阵的构成
平移矩阵的 4行结构 为:
第一行:1 0 0 tx
第二行:0 1 0 ty
第三行:0 0 1 tz
第四行:0 0 0 1
其中,tx、ty、tz
是x、y、z方向的平移量;主对角线固定为1,其余非平移位置元素为0。
3. 平移矩阵的计算逻辑
将平移矩阵与 点(齐次坐标,w=1) 或 向量(齐次坐标,w=0) 做矩阵乘法:
- 点:因w=1,平移分量参与计算,点会沿x、y、z方向平移
tx、ty、tz
; - 向量:因w=0,平移分量被“抵消”,向量方向和长度保持不变。
4. 平移矩阵的正交性与逆矩阵
- 是否为正交矩阵:不是(正交矩阵需“转置等于逆矩阵”,平移矩阵不满足);
- 逆矩阵形式:将平移分量取反(
-tx、-ty、-tz
),4行结构为:
第一行:1 0 0 -tx
第二行:0 1 0 -ty
第三行:0 0 1 -tz
第四行:0 0 0 1
(逆矩阵作用:抵消原平移,让点/向量回归初始位置。)
旋转矩阵
1. 旋转矩阵的构成
旋转矩阵为 3×3矩阵(齐次坐标下可扩展为4×4,核心3×3结构如下),按旋转轴划分:
- 绕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 ]
2. 旋转矩阵的计算
旋转矩阵与 点(或向量,齐次坐标下w=1或0) 做矩阵乘法时:
- 点的位置、向量的方向,都会 沿对应轴旋转β度(二者运算后均会产生旋转变化)。
3. 旋转矩阵的正交性
旋转矩阵 属于正交矩阵:
- 利用这一特性,可通过 旋转矩阵的转置矩阵 抵消原旋转操作(即实现“旋转还原”)。
缩放矩阵
1. 缩放矩阵的构成
缩放矩阵为 4×4矩阵,结构如下:
[ kx 0 0 0 ]
[ 0 ky 0 0 ]
[ 0 0 kz 0 ]
[ 0 0 0 1 ]
- 统一缩放:当 ( \boldsymbol{kx = ky = kz} ) 时,称为统一缩放(各轴缩放比例相同);
- 非统一缩放:当 ( \boldsymbol{kx、ky、kz} ) 不全相等时,称为非统一缩放(各轴缩放比例不同)。
2. 缩放矩阵的计算
缩放矩阵与 点(或向量,齐次坐标下w=1或0) 做矩阵乘法时:
- 点的位置、向量的长度,都会 沿x、y、z轴按 ( kx、ky、kz ) 比例缩放(二者运算后均会产生缩放变化)。
3. 缩放矩阵的正交性与逆矩阵
- 是否为正交矩阵:不是(正交矩阵需满足转置等于逆,缩放矩阵不满足);
- 逆矩阵形式:将各轴缩放因子取倒数(( 1/kx、1/ky、1/kz )),矩阵结构为:
[ 1/kx 0 0 0 ]
[ 0 1/ky 0 0 ]
[ 0 0 1/kz 0 ]
[ 0 0 0 1 ]
(逆矩阵作用:抵消原缩放变换,让点/向量回归初始大小。)
矩阵的符合运算
1. 复合运算的定义
复合运算指 将平移、旋转、缩放等单一矩阵变换组合起来,形成一个包含多步变换的复杂过程。
2. 计算顺序对结果的影响
矩阵乘法 不满足交换律:
- 若变换顺序不同(如先旋转后缩放 vs 先缩放后旋转),最终点/向量的变换结果 可能完全不同。
3. Unity中的运算规则
- 复合运算顺序:统一遵循 先缩放 → 再旋转 → 后平移(因缩放会影响旋转中心,平移需在最后保证位置正确);
- 复合旋转顺序:旋转轴的运算顺序固定为 Z轴 → X轴 → Y轴(即先绕Z轴转,再绕X轴转,最后绕Y轴转)。
坐标空间变换
1. 坐标空间的定义
坐标空间是 描述和定位物体位置的数学概念,由 基础参照物(原点)和坐标轴 共同构成。
2. 多坐标空间存在的原因
不同的问题场景,需要 不同的坐标系 来描述和解决特定空间问题(如局部空间、世界空间的区分),从而更高效地满足开发需求。
3. 坐标空间的变换逻辑
在渲染管线中,需借助 矩阵运算,将坐标数据在多种坐标空间之间转换,最终得到 点或向量在不同空间中的数据表示(如从模型空间转换到世界空间)。
坐标空间的变换逻辑
1. 坐标空间的组成
三维坐标空间由 坐标原点的位置 和 3个坐标轴的方向 共同构成。
2. 坐标空间之间的关系
- 多数坐标空间可视为 另一个坐标空间的子空间(例如模型空间是世界空间的子空间);
- 在Unity中,坐标空间的变换,本质是 父空间与子空间之间,对点或向量的转换运算。
3. 坐标空间的变换矩阵
- 子→父空间(Mₛ→f):
矩阵前三列对应 子空间坐标轴在父空间中的方向向量(无缩放时为单位向量,有缩放时向量长度随缩放变化),第四列对应 子空间原点在父空间的位置,底部行固定为[0, 0, 0, 1]
(适配齐次坐标); - 父→子空间(Mf→s):
是 子→父变换矩阵(Mₛ→f)的逆矩阵(即 ( \text{Mf→s} = \text{(Ms→f)}^{-1} ) ),用于将父空间数据转换到子空间。
模型空间变换
1. 模型空间的意义
模型空间的核心作用是 方便建模:模型的顶点、向量等数据,默认基于模型空间自身的原点和坐标轴来定义(比如模型顶点坐标是相对于模型中心的位置)。
2. 模型空间变换的定义
“模型空间变换”指:通过 矩阵乘法运算,将 模型空间中的点或向量,转换为 相对于世界坐标空间的数据表示(也就是让模型数据融入全局场景的坐标体系)。
3. 模型空间的变换方法
有两种实现思路:
- 方法一:假设 初始时模型空间与世界空间重合,当模型发生缩放、旋转、平移变换时,模型空间内的点和向量,也同步执行 相同的变换操作(模拟模型“自身变化”对顶点的影响);
- 方法二:遵循上节“坐标空间变换规则”计算:若存在缩放,直接用 模型坐标轴的单位方向向量,乘以对应轴的缩放因子(构建子→父空间的变换矩阵,把模型数据转换到世界空间)。
观察空间变换
1. 观察空间的意义
观察空间是 摄像机的模型空间,它决定了渲染时的 视角(看向的方向)和视野(可见范围) 。
2. 观察空间变换指什么
观察空间变换是渲染管线的第二步,指 将世界空间中的数据,通过矩阵运算转换为观察空间下的数据 (即从“世界视角”转换为“摄像机视角”的数据表示)。
3. 如何进行观察空间变换
- 首先对摄像机的空间进行变换;
- 得到的结果再进行观察空间变换,变换方式有两种:
- 方式一:遵循坐标空间变换规则(如利用类似子→父空间的变换矩阵 ( M_{\text{世界→观察}} ) 计算);
- 方式二:通过反向变换,让观察空间和世界空间的坐标轴同向,使世界空间下的数据表达式和观察空间下的数据表达式直接对应 。
裁剪空间变换
视锥体与齐次裁剪空间
1. 视锥体
视锥体是三维空间中表示摄像机可见区域的虚拟体积,决定了哪些内容能被渲染,哪些内容会被裁剪。
2. 齐次裁剪空间
齐次裁剪空间是通过将摄像机的视锥体投影到一个规范化的立方体而转换来的。这个立方体就是齐次裁剪空间,是为了让我们可以更通用、便捷地来进行裁剪工作。
裁剪空间必备知识点
1. 摄像机视锥体的投影方式
- 透视投影:将视锥体内的顶点与摄像机原点连线,线条与 近裁剪面 的交点,即为顶点的投影点(模拟真实透视效果,远小近大);
- 正交投影:将视锥体内的顶点,向近裁剪面做 平行于左右裁剪面的直线,直线与近裁剪面的交点,即为顶点的投影点(无透视变形,远近大小一致)。
2. 相似三角形的重要性质
- 对应角相等:若△ABC与△A′B′C′相似,则 ∠A=∠A′、∠B=∠B′、∠C=∠C′;
- 对应边成比例:对应边的长度比值相等(如 ( a/a’ = b/b’ = c/c’ = k ) ),其中 ( k ) 称为相似比。
正交投影变换矩阵
1. 变换目标
推导 摄像机正交投影空间 → 齐次裁剪空间 的变换矩阵。
2. Unity正交投影的核心参数
- Size:视锥体 竖直方向高度的一半(控制上下范围);
- Near:近裁剪面到摄像机的距离;
- Far:远裁剪面到摄像机的距离;
- 宽高关系:
- 视锥体高度 = ( 2 \times \text{Size} );
- 视锥体宽度 = ( \text{Aspect} \times 2 \times \text{Size} )((\text{Aspect}) 是画面宽高比,即 宽/高)。
3. 正交投影变换矩阵的推导步骤
通过两步变换构建矩阵:
- 平移视锥体中心:将正交视锥体的中心,移动到 观察空间的原点(对齐坐标中心);
- 缩放映射范围:将视锥体的 xy坐标范围,缩放并映射到 [-1, 1]的正方体空间(让裁剪更统一)。
最终结合两步运算,得到正交投影的变换矩阵。
透视投影变换矩阵
1. 变换目标
推导 摄像机透视投影空间 → 齐次裁剪空间 的变换矩阵。
2. Unity透视投影的核心参数
- Near:近裁剪面到摄像机的距离;
- Far:远裁剪面到摄像机的距离;
- FOV(Field of View):决定透视锥的“开口角度”(竖直方向的视野范围);
- 宽高计算:
- 近裁剪面:
- 高度 = ( 2 \times \text{Near} \times \tan\left(\frac{\text{FOV}}{2}\right) );
- 宽度 = ( \text{Aspect} \times \text{近裁剪面高度} )((\text{Aspect}) 为画面宽高比,即 宽/高);
- 远裁剪面:
- 高度 = ( 2 \times \text{Far} \times \tan\left(\frac{\text{FOV}}{2}\right) );
- 宽度 = ( \text{Aspect} \times \text{远裁剪面高度} )。
- 近裁剪面:
3. 透视投影变换矩阵的推导步骤
通过三步变换构建矩阵:
- 透视锥→长方体:将透视形状的视锥体,通过“挤压”变换为 长方体(消除透视的锥度,转为正交类似的形状);
- 平移中心对齐:将长方体的中心,移动到 观察空间的原点(统一坐标中心);
- 缩放映射范围:将长方体的 xy坐标范围,缩放并映射到 [-1, 1]的正方体空间(标准化裁剪范围)。
最终结合三步运算,得到透视投影的变换矩阵。
裁剪空间变换
1. 裁剪空间变换的意义
为了让裁剪工作更通用、便捷,统一将正交或透视投影的视锥体,转换到 齐次裁剪空间 中进行处理。
2. 顶点裁剪的判断规则
完成裁剪空间变换后,通过坐标范围判断顶点是否保留:
- 正交摄像机:顶点坐标需满足 ( -1 \leq x \leq 1 )、( -1 \leq y \leq 1 )、( -1 \leq z \leq 1 ) ,超出该范围的顶点会被裁剪;
- 透视摄像机:顶点坐标需满足 ( -w \leq x \leq w )、( -w \leq y \leq w )、( -w \leq z \leq w )(其中 ( w ) 是齐次坐标的w分量),超出则被裁剪。
屏幕空间变换
1. 屏幕空间的意义
屏幕空间对应的位置信息是 真实的像素位置。
2. 屏幕空间变换指什么
将模型空间的点或向量从 裁剪空间 变换到 屏幕空间(是顶点变换的第四步,即 裁剪空间 → 屏幕空间 的转换)。
3. 如何进行屏幕空间变换
- X坐标:(\boldsymbol{X_s = \dfrac{\text{Width} \cdot X_{clip}}{2 \cdot W_{clip}} + \dfrac{\text{Width}}{2}})
- Y坐标:(\boldsymbol{Y_s = \dfrac{\text{Height} \cdot Y_{clip}}{2 \cdot W_{clip}} + \dfrac{\text{Height}}{2}})
- Z:(Z_{clip}) 会被存入深度缓冲(不同硬件存储方式可能不同),用于深度测试计算(后续讲解);
- W:(W_{clip}) 会被保留,用于透视校正插值等计算(后续讲解)。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com