Mathematics for Computer Graphics

计算机图形学
数学交互笔记

线性代数 · 球面积分 · 辐射度量 · 蒙特卡洛 · 函数逼近
Linear Algebra Spherical Integral Rendering Equation Monte Carlo Spherical Harmonics Spherical Gaussians
01 图形学数学体系全局概览

现代计算机图形学(尤其是实时渲染与离线路径追踪)建立在坚实的数学基础之上。我们将整个体系提炼为以下四大支柱,每一个都对应着不同的渲染流水线阶段:

📐 线性与几何代数

向量与矩阵:点积(光照余弦项)、叉积(法线/面积元)。
变换:齐次坐标、正交/透视投影、Rodrigues 旋转公式。
四元数:万向节死锁解决、Slerp 插值。

📈 微积分与分析

坐标系:球面坐标参数化、立体角面积元。
微积分:Jacobian 换元积分、弧长公式。
向量分析:梯度/散度、Gauss/Stokes 定理(可见性与光照积分)。

🎲 概率与统计

分布:均匀、余弦加权、GGX 法线分布。
蒙特卡洛:重要性采样 (IS)、多重重要性采样 (MIS)。
方差:估计器收敛速度

✨ 函数逼近与数值计算

展开:泰勒展开 (Shader 优化)、球谐函数 (SH, 低频环境光)。
球面高斯 (SG):高频光照与 SSS 拟合。
求交:Möller–Trumbore (射线-三角)、分离轴定理 (SAT)。

阅读路径建议

本笔记按从 底层数学几何工具物理建模函数逼近 的顺序组织。如果你已经熟悉前置内容,可以直接跳转到自己感兴趣的章节。整体阅读约需 30–40 分钟。

02 线性代数与几何变换

图形管线本质上是一连串线性 / 仿射变换的级联:模型空间 → 世界空间 → 视图空间 → 裁剪空间 → 屏幕空间。每一步都靠矩阵乘法驱动;而点积、叉积则是局部 shading 的灵魂。

向量运算速查表

运算公式几何意义典型应用
点积 投影长度 / 夹角余弦 Lambert 项、可见性测试
叉积 ⊥ 平面 有向面积 / 旋转轴 三角形法线、TBN 切空间
混合积 平行六面体有向体积 四面体定位、行列式判正反
投影向量 上的投影 切线-法线分解、SH 系数提取
反射向量 关于法线的镜面对称翻转 镜面反射、Phong/Blinn-Phong

仿射变换与齐次坐标

在 3D 空间中,旋转、缩放是线性变换(保留原点),用 3×3 矩阵表示;但平移不是线性变换。为了用矩阵乘法统一处理所有仿射变换,我们引入齐次坐标 ,使用 4×4 矩阵:

三大基础仿射变换矩阵

透视投影矩阵将 信息隐藏到第四分量 中,再通过 x/w, y/w, z/w(齐次除法)实现 深度映射。

Rodrigues 旋转公式

给定旋转轴 (单位向量)和旋转角度 ,可以构造任意 3D 旋转矩阵。这就是著名的 Rodrigues 旋转公式

其中 对应的反对称矩阵(cross-product matrix),满足 。三项分别对应:保留分量、轴向投影、旋转分量。

四元数(Quaternion)

为了避免欧拉角的万向节锁定 (Gimbal Lock)、并实现平滑的旋转插值,工业界普遍使用单位四元数表示 3D 旋转:

单位四元数 q 表示绕 u 旋转 θ

▸ 交互:反射向量 几何直观

入射向量 (黄)撞击法线 (紫,可旋转)后产生反射向量 (青)。注意当法线旋转时, 改变符号会让反射方向跳变到另一侧。

−0.643
入射角 50°
实战取舍

欧拉角用于用户输入(直观,但有 gimbal lock);4×4 矩阵用于顶点变换 GPU 一次性吃下(高效,但 16 个浮点);四元数用于动画存储与插值(紧凑 4 个浮点、平滑、组合稳定)。一个工业引擎里三种表示同时存在,按需互转。

03 微积分:球面坐标系与立体角积分

在 BRDF 归一化、IBL 预计算以及渲染方程中,我们几乎无时无刻不在球面上做积分。理解 立体角微元(Solid Angle Differential) 的来源是图形学数学的必修课。

单位向量参数化

其中极角 从 z 轴量起,方位角 从 x 轴绕 z 轴量起。

微元面积 的推导

为什么立体角微元是 ?这里提供几何直观与代数严谨两种推导视角:

在球面上,考虑一个极小的"矩形补丁"(patch):

  • 1 方向弧长:固定 ,沿子午线移动 ,对半径 的圆,弧长为
  • 2 方向弧长:固定 ,绕 z 轴旋转。此时旋转的真实半径(投影到 xy 平面的半径)是 ,因此弧长为 。这就是 出现的根源。
  • 3 面积元:相乘得到 。在单位球 () 上,即为立体角微元

将参数化映射 看作一个曲面参数化,曲面元由偏导叉积的范数给出:

分别对 偏导:

两向量正交(),叉积模长直接为 。等价地用度量矩阵 行列式开根 ,结果完全一致。当 即得

▸ 交互:极角 与微元面积的关系可视化

在北极点()附近, 趋于 0,微小角度 张开的面积极小;而在赤道()附近, 最大,微元面积最大。这就是高纬度地图投影变形(Mercator)的根本原因。

旋转半径
0.707

图形学高频积分结论速查

公式几何/物理意义应用场景
单位球的总立体角 环境光积分常数 / 点光源能量
半球总立体角 均匀半球采样 PDF 归一化
半球余弦积分 Lambertian BRDF 归一化 ()
高次余弦积分 Phong / Blinn-Phong 波瓣能量归一化
小结:为什么 GGX 分母里有 4?

注意全球面 和半球 的关系。Cook–Torrance 高光项分母里的 4(n·l)(n·v) 中的因子 4,正是从微表面分布的"半向量积分到入射向量"换元的 Jacobian(雅克比)中冒出来的——这与立体角的 同源。

04 几何计算与求交检测

光栅化、光线追踪、碰撞检测都建立在几何原语之上:点-线-面的距离、射线与几何体的交点、包围体之间的相交判断。这一节是工程师的高频工具箱。

反射与折射:从向量代数到光学

几何光学的两条基本定律完全可以用向量公式给出,无需任何三角函数:

反射 (Law of Reflection)
折射 (Snell's Law, 向量形式)

是相对折射率。当根号内为负时表示全反射 (Total Internal Reflection, TIR),没有折射光线。

▸ 交互:Snell 折射律 与 全反射临界角

入射光(黄)从介质 1(上)射向介质 2(下)。当 (如水到空气,)且入射角超过临界角 时,发生全反射,没有透射光。这是水下看天空看不到、海市蜃楼、光纤通信的物理基础。

折射角 = 22.0°  临界角 = 48.8°  状态 = 折射

距离与投影公式

问题公式备注
点到平面距离 是平面法向, 是平面上一点
点到直线距离 是直线方向
上的投影 切线-法线分解的基础

射线与三角形求交:Möller–Trumbore

给定射线 与三角形 ,求交点等价于求解 ,使得射线落在三角形的重心坐标上:

合法解需满足 以及 。Möller–Trumbore 算法用 Cramer 法则把求解化为两个叉积,极快,是现代光线追踪 BVH 叶节点的标配。

重心坐标(Barycentric Coords)

对于三角形内任意点 ,其重心坐标 满足 ,且 。这是属性插值(uv、法线、颜色)的核心:

透视校正插值 (Perspective-Correct Interpolation)

把三维三角形投影到屏幕之后,屏幕空间的重心坐标不能直接用来插值属性(uv、法线、颜色、深度)。原因:透视投影是 的非线性变换,世界空间均匀的步长被压成屏幕空间后非均匀,朴素的屏幕空间线性插值会产生仿射变形

错误做法 — 屏幕空间仿射插值

屏幕空间的重心坐标。这种插值会让纹理在受透视压缩的三角形上拉伸不均,且双三角形拆分的四边形会沿着对角线出现明显的纹理折痕 (Texture Kink)

正确做法 — 除 校正

推导思路:在世界空间中属性 沿三角形线性变化;投影后屏幕空间的 是世界到屏幕映射的逆比例。所以 屏幕空间都保持仿射,可以用屏幕重心坐标线性插值,最后相除即得真正的

GPU 管线实现

顶点着色器输出 。光栅化阶段对每个像素:

  1. 用屏幕空间重心坐标线性插值
  2. 每像素做一次除法

这就是片段着色器收到的 varying 已经是透视校正后的值。HLSL/GLSL 中可以用 noperspective 限定符强制关闭它(例如全屏 quad 的屏幕坐标插值无需校正)。

▸ 交互:仿射 vs 透视校正

同一个梯形(代表透视投影后的方格平面),左侧用屏幕仿射插值 UV,右侧用 校正。注意左侧棋盘格沿对角线(虚线)出现明显折痕、上下两半的纹理走向不一致;右侧则在对角线两侧连续光滑——这就是 GPU 默认行为。透视强度(顶部 )越大,差异越显著。

深度测试中的应用

同样的逻辑适用于深度 在屏幕空间是线性的(这就是为什么硬件 Z-Buffer 实际存储的是 而非 )。利用这个性质 GPU 在光栅化时无需除法即可用屏幕空间增量更新深度,是早期 Z-Test 优化的关键。Reverse-Z(远 = 0,近 = 1)配合浮点深度的精度提升正是建立在 在视锥近端的非线性聚集上。

射线与球体求交

射线-球体求交是解析光线追踪最简单也最常用的情形:把射线方程代入球面隐式方程,得到关于 的一元二次方程。

代数推导
线

,代入并展开:

已归一化时 。判别式 决定相交情形: 不相交; 相切; 双交点

几何形式(数值更稳定)
沿线线

,提前剔除。Early-Out 序列:① 若 (原点在外)且 → 射线背向,miss;② 计算 ,若超过 → miss;③ 否则求根。仅 1 个 dot product 就能完成大部分剔除,是包围球剔除速度优势的来源。

数值稳定性陷阱

当射线起点远离球面(行星尺度)且半径很大时,朴素地计算 会发生灾难性相消 (Catastrophic Cancellation)—— 两个量级接近的大数相减损失有效位。PBRT 的稳健写法:先求向量 的长度平方作为 ,再用 ,避免了大数相减。这点在地球-大气双壳模型的大气散射、以及体积云薄壳(云层等高度面 球壳)中尤其重要。

▸ 交互:射线与球体求交

黄色为射线 (虚线为延伸方向),紫色为球体。从球心 到射线的虚线段是最近距离 ;当 时射线穿过球体,得到两个交点 (青色)。注意当原点 进入球体时, 变为负(被丢弃), 为实际出射点。

=   =   状态 =
在图形管线中的应用

射线-球求交是若干系统的核心原语:包围球剔除(BVH 叶节点常用,比 AABB 更紧凑但旋转不变)、大气散射(行星-大气双层球壳,参考 Bruneton & Neyret 2008、Hillaire 2020)、体积云(云层等高度面建模为薄球壳,参考 GPU Pro 7 / Horizon: Zero Dawn 实现)、SDF Sphere Tracing(每步以最大无碰球为安全步长)、以及软粒子 / Impostor 球面替代。其廉价的 Early-Out(仅 1 个 dot product 就能 miss 大部分场景)让它常作为复杂剔除的第一道滤网

射线与 AABB 求交 (Slab 方法)

AABB(Axis-Aligned Bounding Box, 轴对齐包围盒)是 BVH 节点的标准选择。射线-AABB 求交的 Slab 方法把每个轴看作一对平行的"板"(slab),射线穿过各 slab 都得到一个 区间,所有区间的交集就是射线落在 AABB 内部的参数范围。

每轴 区间

轴同理。预计算 后,每轴只需 2 次乘法 + 1 次 min/max。 对一条射线只算一次,跨 BVH 节点复用

区间求交

命中条件:。第一个交点的 (起点在盒内时为 0)。整个流程无条件分支(min/max 在 SIMD/SIMT 上是单指令),可向量化。

退化与 NaN 处理

(射线与 X 轴正交)时直接除得到 ,这其实是正确行为:表示射线永远不穿过 X slab 边界,区间退化为整条实数轴。利用 IEEE 754 的 与 NaN 规则配合 min/max分支自由的实现(Williams et al. 2005, "An Efficient and Robust Ray–Box Intersection Algorithm")能在大多数情形下自动正确处理。但 且原点恰在 slab 边界(产生 NaN)时需要特判,常用 trick 是把零方向 clamp 到极小非零数,或显式预筛 NaN。

▸ 交互:Slab 方法可视化

紫色矩形为 AABB;金色虚线垂直带为 X slab,青色虚线水平带为 Y slab。黄色射线与 X slab 边界相交得到金色点( 区间),与 Y slab 边界相交得到青色点( 区间)。两区间的交集(白点 → 实线段)就是射线穿过 AABB 的部分。当交集为空时整体不命中。

X slab =  Y slab =  交集=  状态=
在加速结构中的应用

射线-AABB 是 BVH 遍历的最内核:每个内部节点测试一次 ray-box,未命中即整棵子树跳过。现代实现(Intel Embree、NVIDIA OptiX、Microsoft DXR、AMD HW RT 单元)用 SIMD 一次测 4–8 个 BVH 节点(QBVH/MBVH/Wide BVH)。Slab 方法的无分支特性加上逆方向预计算(每条射线只算 1 次 )让它非常适合 SIMD/SIMT。Tavian Barnes 2011 优化版进一步用有符号方向位掩码直接在 中选定 near/far 端,省去运行时 swap。

包围体与分离轴定理 (SAT)

对于凸多面体之间的相交检测,分离轴定理是基础工具:

使

候选轴只需检查:(1) 各面法线,(2) 各对边的叉积。AABB 之间只需 3 个轴(坐标轴);OBB 之间需要 15 个候选轴。GJK 算法是 SAT 的更通用增量版本。

05 辐射度量学与渲染方程

渲染就是能量在场景中的传输模拟。要写对渲染方程,必须先把"能量"这个概念分清楚:通量、辐照度、辐射率到底差在哪里?

四个基本辐射量

符号 / 定义单位直观解释
辐射通量 (Flux) ,能量随时间的速率 W (瓦特) 整个光源每秒辐射多少能量
辐射强度 (Intensity) W/sr 单位立体角上的功率(描述点光源)
辐照度 (Irradiance) W/m² 单位面积上接收到的功率
辐射率 (Radiance) W/(m²·sr) "图形学最重要的量",沿光线传输保持不变
为什么 Radiance 才是渲染的核心?

因为真空中沿光线传播时,辐射率 不随距离衰减(这就是著名的"radiance invariance")。摄像机/眼睛只关心从某方向射入的 ,所以渲染方程的左右两边都用 衰减实际上发生在"立体角" 的几何上,而不是 上。

渲染方程(Kajiya 1986)

整个真实感渲染领域的"统一场论":表面某点 沿方向 的出射辐射率 ,等于自发光 加上对所有入射方向的反射积分:

The Rendering Equation

注意三个因子:BRDF (材质)、入射辐射率 (光源 + 间接光)、余弦项 (来自 Lambert 余弦定律)。

BRDF 的三大约束

应用:Lambertian 漫反射的归一化

分母中的 直接来自 §03 中的恒等式 。把 代入能量守恒约束,整个等式正好饱和(取 1), 即为反射率(albedo)。

06 概率统计与蒙特卡洛积分

由于 BRDF 的复杂性、IBL 环境贴图、可见性 V 项等因素,渲染方程几乎不可能写出解析解。蒙特卡洛 (MC) 积分是几乎所有现代离线渲染器的核心数学武器。

MC 估计量 (Monte Carlo Estimator)

关键洞察:积分 = 期望。任意 PDF 都能给出无偏估计,前提是 方差(噪点)才是要优化的目标。

收敛速度与方差

MC 积分的标准差按 衰减。这意味着:

MC 的诅咒 / 福音

诅咒:误差减半需要 4× 采样数。10× 的画质提升需要 100× 的算力。这就是为什么 1080p 路径追踪一帧需要数千 spp。
福音:收敛速度独立于积分维度,传统数值积分(梯形/Simpson)在高维下完全崩溃。这让全局光照、参与介质、运动模糊这些高维问题都可以用同一套框架处理。

常用半球采样分布

分布PDF 反演采样 (ξ₁,ξ₂ ~ U[0,1])用途
球面均匀 环境光、点光源
半球均匀 baseline,方差较高
余弦加权半球 Lambert 漫反射的最优 IS
GGX 法线分布 正比于 金属/介电高光的 IS

▸ 交互:均匀 vs 余弦加权半球采样

从顶视图(俯视半球)看采样点的分布。均匀采样(左)每个立体角等概率,但被余弦项 加权后赤道附近的样本"贡献被压低",是浪费。余弦加权采样(右)把样本集中在天顶附近,与 Lambert BRDF 的余弦项形状匹配,方差大幅降低。

重要性采样 (Importance Sampling)

核心思想:,使估计量 接近常数,方差就能趋近于 0。在渲染里就是:让采样方向集中在 BRDF + 入射光都大的地方。

多重重要性采样 (MIS)

当被积函数包含多个尖锐部分(如 BRDF 高光 + 小型光源),单一 PDF 难以同时覆盖。MIS 用一个加权平均把多个 PDF 组合起来:

MIS 估计量(带启发权重 wᵢ)

实践中常用 balance heuristicpower heuristic 通常最佳)。MIS 是 Veach 1997 博士论文的核心成果,奠定了现代路径追踪的工程基础。

07 函数逼近:球谐函数 (SH)

渲染中很多函数定义在球面上:环境光照、可见性遮罩、辐射传输算子……我们希望用少量系数就能存储和重建它们。球谐函数 (Spherical Harmonics) 就是球面上的"傅里叶基"。

SH 基函数

球谐基记作 ,按"频率" 分组(band),每一阶 包含 个分量()。它们在球面上构成正交归一基

任意球面函数 可以投影展开:

SH 投影与重建

在实时渲染里我们截断到前 3 阶(9 个系数)即可良好近似 Lambert 漫反射;更高频的内容则需要更高阶或者换用 SG。

SH 在图形学中的两大杀手级应用

SH vs SG:低频 vs 高频,互补不冲突

特征球谐 SH球面高斯 SG
表达频率 低频(截断阶数受限) 高频(锐利波瓣 大)
支撑域 全球面(每个 局部锥体(围绕
积分 正交:内积闭式 同样有闭式解析积分
典型用途 Diffuse light probes Specular lobes / SSS profile
组合方式 线性叠加 多 lobe 拟合(4–8 个)
混合策略 — 工业界常见做法

低频段()用 SH 做 baseline 漫反射,再叠加几个 SG lobe 来表示主光方向 + 高光波瓣。Naughty Dog(《最后生还者》)和 Activision(《使命召唤》)的 GDC 报告都使用了这种混合表示。

08 球面高斯 (Spherical Gaussians)

球面高斯 (SG) 是把 1D 高斯函数推广到球面上的产物。SH 擅长低频,SG 则在表示高频且空间局部化 的内容上独占优势——比如金属高光、SSS profile、Glossy BRDF、各向异性 specular 等。

从 1D Gaussian 到 SG
广
:求值方向(单位向量)
:波瓣轴向 (Lobe Axis)
:锐度 / 带宽(Sharpness,正数,越大越锐利)
:振幅(Amplitude)

注意指数中是 而不是 — 前者完全用点积表达,避免了反三角函数,对 GPU 极其友好。当 (同方向)时取最大值 ;远离时指数衰减。

SG 的代数性质(为什么它这么有用)

性质 1:两个 SG 的乘积仍是 SG

这意味着把多个 SG 进行点乘组合(如 BRDF lobe × 入射光分布)后,结果还在 SG 家族里,可以继续解析处理。

性质 2:球面上的全积分有闭式解
性质 3:两个 SG 的内积也有闭式解

把入射光和 BRDF 都拟合成 SG 后,渲染方程的某一项可以脱离 MC 直接闭式求出,这是 SG 烘焙类管线(Naughty Dog, MJP The Order: 1886)的核心技术。

▸ 交互:球面高斯 (SG) 波瓣形态剖面

在二维截面上观测 SG 的形态。固定求值向量 为角度 ,轴向 取决于偏移角。注意 如何控制"粗糙度"(波瓣宽度): 大 ↔ 锐利尖瓣 ↔ 镜面金属; 小 ↔ 宽阔平坦 ↔ 粗糙漫反射。

SG 的实战用途

参考阅读

Matt Pettineo — SG Series Part 1–6(必读)
Approximating Subsurface Scattering With Spherical Gaussians
Xu et al. Anisotropic Spherical Gaussians, SIGGRAPH Asia 2013
Iwasaki et al. Real-time Rendering of Dynamic Scenes under All-Frequency Lighting using Integral Spherical Gaussian, EG 2012

结语 · 数学到工程的桥

这八个章节从向量代数一路串到 SG 高频烘焙,背后只有一条主线:把"光在场景里如何分布"形式化为可计算的数学对象。线性代数提供舞台、微积分提供积分尺度、概率提供采样工具、函数逼近提供压缩存储。任何一个图形学算法都可以拆回这四个基础。

下一步可以延伸阅读:《Physically Based Rendering: From Theory to Implementation》(PBRT)《Real-Time Rendering 4th》、Eric Veach 的博士论文(MIS 与双向路径追踪奠基作)、Brian Karis Real Shading in UE4(2013 SIGGRAPH PBR 业界标杆)。