《计算机图形学》卷三《光线追踪与全局光照》全 50 篇,三卷本收官。它回答一个问题:光能不能被还原成一个可估计的积分,并且这个估计是可度量、可复现的?
卷一把渲染的骨架封版了:装配、深度、覆盖全部落成整数,Python 与 TypeScript 产出逐字节相同的像素缓冲。卷二不碰骨架,只换着色环节,把「颜色从哪来」写成可逐像素断言的量。本卷换的是可见性本身:不再逐像素遍历屏幕、用边函数判定覆盖,而是逐像素发一条主光线,靠求交、递归与积分得到颜色。同一份 config/scene_spec.json 由此有了第三条消费路径。
这条路径的第一个可度量事实是加速结构值不值。本卷基线场景有 896 个三角形:不做加速,76800 条主光线每条都要测试全部 896 个三角形;套上 511 个节点的 BVH 之后,每条主光线只访问 42.1658 个节点、测试 14.58 个三角形。第二个可度量事实是跨语言仍然逐位一致:光追的除法链中间量已摸到 2^53,TypeScript 侧必须全程 BigInt(Number 的 >> 只有 32 位),两侧的像素缓冲 sha256 都是 213b413069ca66c9…,主光线数、阴影光线数、遮挡数、BVH 访问与测试计数全部逐条相同。
第三个事实要到第 5 章之后才出现:光是一个积分,而积分只能用估计。一旦引入蒙特卡洛,输出就不再是唯一确定的像素值,而是一个带方差的估计。本卷的后半程都在处理这件事——怎么让估计无偏、怎么把方差压下去、怎么判断「够了」、怎么在跨语言与跨宿主之间定义「一致」。这也是本卷与卷一、卷二最本质的区别:前两卷的判据是相等,本卷的判据有一半是收敛。
贯穿全书的仍是程序化生成的虚构场景 《烛影山谷》(lantern-hollow)与工程 lantern:起伏地形 + 三个材质球 + 一盏方向光与一盏点光源,全部几何与纹理由整数噪声生成,不引入任何第三方素材。本页是《光线追踪与全局光照》的全书目录:按章节顺序列出全部 50 篇,点击标题直达正文,也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇
里的分工说明与可运行性口径。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《计算机图形学》卷三《光线追踪与全局光照》 |
| 篇数 | 50 篇(正文 16 章 48 节 + 目录篇 + 附录 A) |
| 贯穿案例 | 程序化场景《烛影山谷》(lantern-hollow,工程 lantern) |
| 核心主张 | 一份场景规格,三种宿主消费;两条一致性纪律 |
| 可运行性 | 六档 S / P / W / D / X / B |
| 前置 | 卷二《着色、光照与纹理》 (16 章 48 节) |
| 后继 | 无(三卷本收官) |
三卷怎么分
| 卷 | 书名 | 回答的问题 | 判据 |
|---|---|---|---|
| 卷一 | 几何、变换与光栅化 | 一次渲染能不能被还原成一组可复现的整数 | 相等(逐字节) |
| 卷二 | 着色、光照与纹理 | 颜色从哪来,能不能写成可逐像素断言的量 | 相等 + 容差 |
| 卷三 | 光线追踪与全局光照 | 光能不能被还原成一个可估计的积分 | 相等 + 容差 + 收敛 |
与站内既有内容的分工
graphics/专题 的 45 篇讲的是现代图形 API 的实时渲染工程:混合光追、实时 GI、体积云、SDF 渲染、GPU 剖析。本卷讲的是离线光追的完整链路——同一条求交与积分链路在 CPU 上写成可逐光线计数的量,产出的是遍历代价曲线与收敛误差,而不是帧率。- 《渲染引擎》
55 篇用 TypeScript 从零造一个引擎(RHI、帧图、剔除、级联阴影)。那套是引擎架构;本卷是光追的跨语言确定性——递归追踪链路在 Python 与 TypeScript 下必须给出同一个
sha256,连 BVH 的访问节点数都要逐条相同。 - 《技术美术与管线工程》 50 篇做的是管线闸门与预算。那套管的是「画得起吗」;本卷管的是「估得准吗、收敛了吗」。
- 卷二《着色、光照与纹理》 封版的是着色公式(
shade(normal, albedo)这一环)。本卷原样复用它的几何、顶点法线与 albedo,只替换「谁来决定这个片元可见」与「颜色怎么被积出来」。第 14 章专门把两条路径的输出逐像素相减,量出这个替换的代价。 - 术语上需要留意:站内的「光子」「辐射度」「采样」大量出现在其它语境(光子晶体、辐射剂量、采样率)。本卷的「光子映射」一律指 photon mapping,「辐射度方法」一律指 radiosity,「重要性采样」一律指 importance sampling。
本卷 16 章
第一部分 · 从光线到求交(第 1–4 章)
- 第 1 章 光线追踪的最小模型
- 第 2 章 求交
- 第 3 章 加速结构
- 第 4 章 阴影、反射与折射
第二部分 · 把光写成积分(第 5–8 章)
- 第 5 章 蒙特卡洛积分
- 第 6 章 路径追踪
- 第 7 章 重要性采样
- 第 8 章 全局光照
第三部分 · 介质、程序化几何与质量(第 9–12 章)
- 第 9 章 体积与参与介质
- 第 10 章 程序化几何与地形
- 第 11 章 符号距离场
- 第 12 章 离线渲染的质量度量
第四部分 · 数值一致与三卷收官(第 13–16 章)
第 13 章 光线追踪的数值一致
第 14 章 光栅化与光追的对照
第 15 章 渲染管线的工程
第 16 章 装配:三卷总收官
附录
可运行性
本卷沿用六档口径:S 是 Python + numpy 的 CPU 光追器(实跑约 6.6–6.9 s/帧 @ 320×240,含 76800 条主光线与 77211 条阴影光线),P 是 TypeScript 定点光追内核(node --test,含与 S 层 sha256 逐字节相同的断言与负例,实跑约 1.2 s),W 是浏览器 WebGL2 片元着色器(SDF ray marching 与两路径对照,Playwright 无头读像素,与 S 层按声明容差比对),D 是规格文本、schema 与清单,X 是需真实 GPU 环境、命令行不可复现的部分(正文逐处标注),B 是参数扰动与相变扫描(软告警不硬失败)。每一节至少有一个 S / P / W 档的代码块,且正文里的每个数字都来自本机实跑。
「渲染正确」在本卷是代理指标,不是「画得好看」:BVH 遍历代价(每条主光线访问的节点数与三角形测试数)、图像误差(MAE、PSNR、最大通道差)、收敛误差(相对参考解的千分比)、方差(同一样本数下估计量的离散度)、停止阈值(首次满足误差判据所需的样本数)。这些只用于相对比较,不做绝对化表述。
怎么读
想先看主张,从目录篇 开始,那里有三卷定位、两条纪律与六档口径。想直接看本卷的入口实验,读第 3.3 节 ——它用一组遍历计数说明「加速结构值不值」这件事是可度量的。只关心「光为什么必须写成积分」,看第 6.1 节 。只关心「怎么知道采样够了」,看第 12.3 节 。想看三条路径的最终对账,直接翻第 16.2 节 。需要查公式与参数,翻附录 A 。