现代计算机图形学(尤其是实时渲染与离线路径追踪)建立在坚实的数学基础之上。我们将整个体系提炼为以下四大支柱,每一个都对应着不同的渲染流水线阶段:
向量与矩阵:点积(光照余弦项)、叉积(法线/面积元)。
变换:齐次坐标、正交/透视投影、Rodrigues 旋转公式。
四元数:万向节死锁解决、Slerp 插值。
坐标系:球面坐标参数化、立体角面积元。
微积分:Jacobian 换元积分、弧长公式。
向量分析:梯度/散度、Gauss/Stokes 定理(可见性与光照积分)。
分布:均匀、余弦加权、GGX 法线分布。
蒙特卡洛:重要性采样 (IS)、多重重要性采样 (MIS)。
方差:估计器收敛速度
展开:泰勒展开 (Shader 优化)、球谐函数 (SH, 低频环境光)。
球面高斯 (SG):高频光照与 SSS 拟合。
求交:Möller–Trumbore (射线-三角)、分离轴定理 (SAT)。
本笔记按从 底层数学 → 几何工具 → 物理建模 → 函数逼近 的顺序组织。如果你已经熟悉前置内容,可以直接跳转到自己感兴趣的章节。整体阅读约需 30–40 分钟。
图形管线本质上是一连串线性 / 仿射变换的级联:模型空间 → 世界空间 → 视图空间 → 裁剪空间 → 屏幕空间。每一步都靠矩阵乘法驱动;而点积、叉积则是局部 shading 的灵魂。
| 运算 | 公式 | 几何意义 | 典型应用 |
|---|---|---|---|
| 点积 | 投影长度 / 夹角余弦 | ||
| 叉积 | 有向面积 / 旋转轴 | 三角形法线、TBN 切空间 | |
| 混合积 | 平行六面体有向体积 | 四面体定位、行列式判正反 | |
| 投影向量 | 切线-法线分解、SH 系数提取 | ||
| 反射向量 | 关于法线的镜面对称翻转 | 镜面反射、Phong/Blinn-Phong |
在 3D 空间中,旋转、缩放是线性变换(保留原点),用 3×3 矩阵表示;但平移不是线性变换。为了用矩阵乘法统一处理所有仿射变换,我们引入齐次坐标
透视投影矩阵将 x/w, y/w, z/w(齐次除法)实现
给定旋转轴
其中
为了避免欧拉角的万向节锁定 (Gimbal Lock)、并实现平滑的旋转插值,工业界普遍使用单位四元数表示 3D 旋转:
入射向量
欧拉角用于用户输入(直观,但有 gimbal lock);4×4 矩阵用于顶点变换 GPU 一次性吃下(高效,但 16 个浮点);四元数用于动画存储与插值(紧凑 4 个浮点、平滑、组合稳定)。一个工业引擎里三种表示同时存在,按需互转。
在 BRDF 归一化、IBL 预计算以及渲染方程中,我们几乎无时无刻不在球面上做积分。理解 立体角微元(Solid Angle Differential) 的来源是图形学数学的必修课。
其中极角
为什么立体角微元是
在球面上,考虑一个极小的"矩形补丁"(patch):
将参数化映射
分别对
两向量正交(
在北极点(
| 公式 | 几何/物理意义 | 应用场景 |
|---|---|---|
| 单位球的总立体角 | 环境光积分常数 / 点光源能量 | |
| 半球总立体角 | 均匀半球采样 PDF 归一化 | |
| 半球余弦积分 | Lambertian BRDF 归一化 ( |
|
| 高次余弦积分 | Phong / Blinn-Phong 波瓣能量归一化 |
注意全球面 4(n·l)(n·v) 中的因子 4,正是从微表面分布的"半向量积分到入射向量"换元的 Jacobian(雅克比)中冒出来的——这与立体角的
光栅化、光线追踪、碰撞检测都建立在几何原语之上:点-线-面的距离、射线与几何体的交点、包围体之间的相交判断。这一节是工程师的高频工具箱。
几何光学的两条基本定律完全可以用向量公式给出,无需任何三角函数:
入射光(黄)从介质 1(上)射向介质 2(下)。当
| 问题 | 公式 | 备注 |
|---|---|---|
| 点到平面距离 | ||
| 点到直线距离 | ||
| 切线-法线分解的基础 |
给定射线
合法解需满足
对于三角形内任意点
把三维三角形投影到屏幕之后,屏幕空间的重心坐标不能直接用来插值属性(uv、法线、颜色、深度)。原因:透视投影是
推导思路:在世界空间中属性
顶点着色器输出
这就是片段着色器收到的 varying 已经是透视校正后的值。HLSL/GLSL 中可以用 noperspective 限定符强制关闭它(例如全屏 quad 的屏幕坐标插值无需校正)。
同一个梯形(代表透视投影后的方格平面),左侧用屏幕仿射插值 UV,右侧用
同样的逻辑适用于深度:
射线-球体求交是解析光线追踪最简单也最常用的情形:把射线方程代入球面隐式方程,得到关于
令
当射线起点远离球面(行星尺度)且半径很大时,朴素地计算
黄色为射线
射线-球求交是若干系统的核心原语:包围球剔除(BVH 叶节点常用,比 AABB 更紧凑但旋转不变)、大气散射(行星-大气双层球壳,参考 Bruneton & Neyret 2008、Hillaire 2020)、体积云(云层等高度面建模为薄球壳,参考 GPU Pro 7 / Horizon: Zero Dawn 实现)、SDF Sphere Tracing(每步以最大无碰球为安全步长)、以及软粒子 / Impostor 球面替代。其廉价的 Early-Out(仅 1 个 dot product 就能 miss 大部分场景)让它常作为复杂剔除的第一道滤网。
AABB(Axis-Aligned Bounding Box, 轴对齐包围盒)是 BVH 节点的标准选择。射线-AABB 求交的 Slab 方法把每个轴看作一对平行的"板"(slab),射线穿过各 slab 都得到一个
命中条件:
当 min/max,分支自由的实现(Williams et al. 2005, "An Efficient and Robust Ray–Box Intersection Algorithm")能在大多数情形下自动正确处理。但
紫色矩形为 AABB;金色虚线垂直带为 X slab,青色虚线水平带为 Y slab。黄色射线与 X slab 边界相交得到金色点(
射线-AABB 是 BVH 遍历的最内核:每个内部节点测试一次 ray-box,未命中即整棵子树跳过。现代实现(Intel Embree、NVIDIA OptiX、Microsoft DXR、AMD HW RT 单元)用 SIMD 一次测 4–8 个 BVH 节点(QBVH/MBVH/Wide BVH)。Slab 方法的无分支特性加上逆方向预计算(每条射线只算 1 次
对于凸多面体之间的相交检测,分离轴定理是基础工具:
候选轴只需检查:(1) 各面法线,(2) 各对边的叉积。AABB 之间只需 3 个轴(坐标轴);OBB 之间需要 15 个候选轴。GJK 算法是 SAT 的更通用增量版本。
渲染就是能量在场景中的传输模拟。要写对渲染方程,必须先把"能量"这个概念分清楚:通量、辐照度、辐射率到底差在哪里?
| 量 | 符号 / 定义 | 单位 | 直观解释 |
|---|---|---|---|
| 辐射通量 (Flux) | W (瓦特) | 整个光源每秒辐射多少能量 | |
| 辐射强度 (Intensity) | W/sr | 单位立体角上的功率(描述点光源) | |
| 辐照度 (Irradiance) | W/m² | 单位面积上接收到的功率 | |
| 辐射率 (Radiance) | W/(m²·sr) | "图形学最重要的量",沿光线传输保持不变 |
因为真空中沿光线传播时,辐射率
整个真实感渲染领域的"统一场论":表面某点
注意三个因子:BRDF
分母中的
由于 BRDF 的复杂性、IBL 环境贴图、可见性 V 项等因素,渲染方程几乎不可能写出解析解。蒙特卡洛 (MC) 积分是几乎所有现代离线渲染器的核心数学武器。
关键洞察:积分 = 期望。任意 PDF
MC 积分的标准差按
诅咒:误差减半需要 4× 采样数。10× 的画质提升需要 100× 的算力。这就是为什么 1080p 路径追踪一帧需要数千 spp。
福音:收敛速度独立于积分维度,传统数值积分(梯形/Simpson)在高维下完全崩溃。这让全局光照、参与介质、运动模糊这些高维问题都可以用同一套框架处理。
| 分布 | PDF | 反演采样 (ξ₁,ξ₂ ~ U[0,1]) | 用途 |
|---|---|---|---|
| 球面均匀 | 环境光、点光源 | ||
| 半球均匀 | baseline,方差较高 | ||
| 余弦加权半球 | Lambert 漫反射的最优 IS | ||
| GGX 法线分布 | 正比于 |
金属/介电高光的 IS |
从顶视图(俯视半球)看采样点的分布。均匀采样(左)每个立体角等概率,但被余弦项
核心思想:让
当被积函数包含多个尖锐部分(如 BRDF 高光 + 小型光源),单一 PDF 难以同时覆盖。MIS 用一个加权平均把多个 PDF 组合起来:
实践中常用 balance heuristic 或 power heuristic:
渲染中很多函数定义在球面上:环境光照、可见性遮罩、辐射传输算子……我们希望用少量系数就能存储和重建它们。球谐函数 (Spherical Harmonics) 就是球面上的"傅里叶基"。
球谐基记作
任意球面函数
在实时渲染里我们截断到前 3 阶(9 个系数)即可良好近似 Lambert 漫反射;更高频的内容则需要更高阶或者换用 SG。
| 特征 | 球谐 SH | 球面高斯 SG |
|---|---|---|
| 表达频率 | 低频(截断阶数受限) | 高频(锐利波瓣 |
| 支撑域 | 全球面(每个 |
局部锥体(围绕 |
| 积分 | 正交:内积闭式 | 同样有闭式解析积分 |
| 典型用途 | Diffuse light probes | Specular lobes / SSS profile |
| 组合方式 | 线性叠加 | 多 lobe 拟合(4–8 个) |
低频段(
球面高斯 (SG) 是把 1D 高斯函数推广到球面上的产物。SH 擅长低频,SG 则在表示高频且空间局部化 的内容上独占优势——比如金属高光、SSS profile、Glossy BRDF、各向异性 specular 等。
注意指数中是
这意味着把多个 SG 进行点乘组合(如 BRDF lobe × 入射光分布)后,结果还在 SG 家族里,可以继续解析处理。
把入射光和 BRDF 都拟合成 SG 后,渲染方程的某一项可以脱离 MC 直接闭式求出,这是 SG 烘焙类管线(Naughty Dog, MJP The Order: 1886)的核心技术。
在二维截面上观测 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 业界标杆)。