《计算机图形学》卷二《着色、光照与纹理》全 50 篇。它回答一个问题:颜色从哪来,能不能写成一组可逐像素断言、可被证伪的量?
卷一把渲染的骨架封版了:装配、深度、覆盖全部落成整数,Python 与 TypeScript 产出逐字节相同的像素缓冲。本卷不碰骨架,只换着色环节——片元的颜色从「逐顶点算完 Lambert 再插值」改为「插值法线后逐像素求值」。这个替换是可度量的:同一份场景规格、同一套几何,两条路径的覆盖掩码差异是 0.0‰,而着色频率差异是 41261 像素(537.2526‰)、MAE 3.5764、PSNR 37.06 dB。骨架没动,差的就只是着色,这正是把规格与实现分离的收益。
做法仍然是那一句话:一份场景规格,三种宿主消费。config/scene_spec.json 是唯一真源,它同时驱动 S 层 Python + numpy 的 CPU 逐像素着色器、P 层 TypeScript 定点着色内核、W 层浏览器 WebGL2 片元着色器。本卷新增的两条纪律与卷一一致:整数与定点逐位一致(逐像素路径的 sha256 是 0d997343ca547ed5…,两侧必须相同),以及浮点按声明容差(GPU 的插值与精度规则与 CPU 不同,一律用不一致像素占比、MAE、PSNR 断言,正文禁写「逐位相等」)。
贯穿全书的仍是程序化生成的虚构场景 《烛影山谷》(lantern-hollow)与工程 lantern:起伏地形 + 三个材质球 + 一盏方向光与环境光,全部几何与纹理由整数噪声生成,不引入任何第三方素材。本页是《着色、光照与纹理》的全书目录:按章节顺序列出全部 50 篇,点击标题直达正文,也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇
里的分工说明与可运行性口径。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《计算机图形学》卷二《着色、光照与纹理》 |
| 篇数 | 50 篇(正文 16 章 48 节 + 目录篇 + 附录 A) |
| 贯穿案例 | 程序化场景《烛影山谷》(lantern-hollow,工程 lantern) |
| 核心主张 | 一份场景规格,三种宿主消费;两条一致性纪律 |
| 可运行性 | 六档 S / P / W / D / X / B |
| 前置 | 卷一《几何、变换与光栅化》 (16 章 48 节) |
| 后继 | 卷三《光线追踪与全局光照》 (16 章 48 节) |
三卷怎么分
| 卷 | 书名 | 回答的问题 |
|---|---|---|
| 卷一 | 几何、变换与光栅化 | 一次渲染能不能被还原成一组可复现的整数 |
| 卷二 | 着色、光照与纹理 | 颜色从哪来,能不能写成可逐像素断言的量 |
| 卷三 | 光线追踪与全局光照 | 光能不能被还原成一个可估计的积分 |
与站内既有内容的分工
graphics/专题 的 45 篇讲的是现代图形 API 的实时渲染工程:PBR 与级联阴影、实时 GI、HDR 管线、后处理链、集群前向。本卷讲的是同一条着色链路在 CPU 上的整数实现——把光照模型、纹理采样与色彩管理写成可逐像素比对的量,产出的是误差曲线与中间缓冲,而不是帧率。- 《渲染引擎》
55 篇用 TypeScript 从零造一个引擎(材质变体、级联阴影、后处理、帧图)。那套是引擎架构;本卷是着色算法的跨语言逐字节证明——逐像素路径在 Python 与 TypeScript 下必须给出同一个
sha256。 - 《技术美术与管线工程》 50 篇做的是管线闸门与预算(材质预算、纹理字节账)。那套管的是「画得起吗」;本卷管的是「算得对吗」。
- 《游戏美术与技术美术》 那条线管的是规范与风格的一致性(一份规范三处消费);本卷管的是着色公式的数值一致性(一份规格三种宿主)。
- 术语上需要留意:站内的「抖动」「批处理」「instancing」「投影」绝大多数是误报(分别是 jitter、batch processing、云实例、数据库 projection)。本卷的「抖动」一律指 dithering(降低量化误差的噪声注入)。
本卷 16 章
第一部分 · 从经验模型到可断言的着色(第 1–4 章)
- 第 1 章 光照模型
- 第 2 章 材质与 BRDF
- 第 3 章 法线与法线贴图
- 第 4 章 阴影
第二部分 · 间接光、材质与纹理(第 5–8 章)
- 第 5 章 环境光与近似全局光照
- 第 6 章 基于物理的着色
- 第 7 章 色彩与色调
- 第 8 章 纹理与采样
第三部分 · 程序化纹理与数值一致(第 9–12 章)
- 第 9 章 程序化纹理
- 第 10 章 后处理
- 第 11 章 抗锯齿的进阶
- 第 12 章 着色的数值一致
第四部分 · 材质、光照与装配(第 13–16 章)
第 13 章 材质系统
第 14 章 光照的工程
第 15 章 着色管线的一致性
第 16 章 装配:从着色到成像
附录
可运行性
本卷沿用六档口径:S 是 Python + numpy 的 CPU 逐像素着色器(向量化插值法线,实跑 156 ms/帧 @ 320×240),P 是 TypeScript 定点着色内核(node --test,含与 S 层 sha256 逐字节相同的断言与负例),W 是浏览器 WebGL2 片元着色器真渲染(Playwright 无头读像素,与 S 层按声明容差比对),D 是规格文本、schema 与清单,X 是需真实 GPU 环境、命令行不可复现的部分(正文逐处标注),B 是参数扰动与相变扫描(软告警不硬失败)。每一节至少有一个 S / P / W 档的代码块,且正文里的每个数字都来自本机实跑。
「着色正确」在本卷是代理指标,不是「画得好看」:图像误差(MAE、PSNR、最大通道差)、不一致像素占比(千分比)、能量守恒残差(半球积分的估计值减 1,必须 ≤ 0)、量化误差(传递函数往返的灰度级残差)、走样阈值(参数扰动下首次出现可见走样的参数值)。这些只用于相对比较,不做绝对化表述。
怎么读
想先看主张,从目录篇 开始,那里有三卷定位、两条纪律与六档口径。想直接看本卷的入口实验,读第 1.3 节 ——它用一组数字证明「骨架封版、只换着色」这件事是可度量的。只关心「颜色为什么必须在线性空间算」,看第 7.1 节 。只关心「怎么证明一个 BRDF 是守恒的」,看第 6.3 节 。需要查公式与参数,直接翻附录 A 。