13.3 跨语言逐位一致的验证
把定点管线写成可参数化形式:baseline 复现 S 层金标准 sha256,再把 `>>` 换成向零截断、把截断除法换成 floor 除法、把子像素位数 6 改成 5,三类扰动各给出一个不同的 sha256(覆盖 43730 / 43734 / 43731,分歧像素 153 / 173 / 646),并由 TypeScript 侧逐字节复现全部四个摘要。
tag
把定点管线写成可参数化形式:baseline 复现 S 层金标准 sha256,再把 `>>` 换成向零截断、把截断除法换成 floor 除法、把子像素位数 6 改成 5,三类扰动各给出一个不同的 sha256(覆盖 43730 / 43734 / 43731,分歧像素 153 / 173 / 646),并由 TypeScript 侧逐字节复现全部四个摘要。
把 GPU 的 top-left rule 写成纯整数判据:有向边 A→B 拥有其边界样本当且仅当 dy<0 或 dy==0 且 dx>0。用顶点落在像素角上的正方形隔离共享边变量,实测 3x3 网格下 top-left 让共享边像素恰好被一个三角形认领(认领合计=并集=144、重复 0、最大认领 1),而 naive `>= 0` 重复 36 个像素。
把同一份《烛影山谷》规格分别喂给 Q16.16 定点管线与 float64 镜像管线:矩阵链最大元素差 5.007e-04,132/487 个顶点的屏幕坐标或深度不同;给定同一条整数坐标时两种光栅化器的像素缓冲逐字节相同,端到端则分歧 153 个像素并给出位置分布与通道差直方图。
纹理被缩小时,一个像素覆盖多个 texel,采其中一个必然走样。解法是预先造好一整串减半的 mip 链,再按屏幕足迹选级。本节用整数盒式平均构造 32→1 的六级链,用 uv 的有限差分算出每像素 LOD,量出最近邻、双线性与 mip 三种过滤的差异,并用「选错一级」的负例验证判据确实有区分力。
顶点上的 UV 直接线性插值到像素是错的:透视投影下屏幕坐标是 x/w,属性在屏幕空间不再线性。正确做法是插值 u/w 与 1/w 再相除。本节在一块近远端 w 相差 2.57 倍的后仰四边形上把两条路径都跑一遍,量出 1923 个像素不同、最大通道偏差 180,再让 WebGL2 用同一份场景复现。
纹理在显存里是一张二维表,UV 就是把这张表贴到三角形上的那套坐标。本节把 uv 也做成 Q16.16 定点数,用整数移位把连续坐标落到具体 texel,并实现 repeat / clamp / mirror 三种寻址——它们分别是位与、钳位与向下取整的模。纹理不引入任何第三方素材,由整数棋盘与渐变程序化生成。
MSAA 只在覆盖上多采样、着色一次。本节用 8 片带深度的叶片,把每像素 4 个子样本各自做覆盖与深度测试再按覆盖平均的 CPU 实现写出来,并让浏览器 WebGL2 用 4 遍平移渲染做同一件事,按 MAE/PSNR/覆盖归属三条容差判据对上,且负例必被拒绝。
把像素切成 N×N 个小格,覆盖率就是落在三角形内的子样本数——0 到 N² 的整数计数。本节用一个斜边三角形,把 2×2 与 4×4 超采样的覆盖率、整数颜色混合与误差随 N 的下降全部写成可断言整数,并与 TypeScript 逐字节对齐。
渲染的本质是把连续场景采样成离散像素。本节用 256×256 的整数波带片与周期 3 斜条纹,把「点采样把高频折回低频」的走样复现出来,再用整数方差把摩尔纹量成可断言的数字;Nyquist 边界上周期 2 的条纹会塌成一个常数,判据在 Python 与 TypeScript 间逐字节复现。
深度缓冲内部只有 65537 个刻度,一个刻度值多少世界距离却随距离按 D² 增长。本节从 5.3 的相机量程视角切回缓冲内部,量化 Q16.16 的最小可分辨深度差、塌陷距离与误差传播,再看逐像素定点插值的截断误差如何沿距离放大,并让 Python 与 TypeScript 两份实现逐字节对齐。
config/scene_spec.json 有 31 个必填字段,分布在渲染参数、相机、两盏光源、地形与球体五组里。本节逐组讲清每个字段的量纲与取值范围,给出纯 Python 的 schema 校验脚本,断言所有数值字段都是整数、Q16.16 落在安全区间内,并用一份被污染的规格证明这套判据会拒绝它。
渲染一帧到底发生了什么?本节把整条链路压成顶点变换、三角形组装、光栅化、逐像素着色四步,用一份 config/scene_spec.json 跑出 487 顶点、896 三角形、43731 个覆盖像素并落盘一张 PNG;每一步都只用整数与定点,为后面三种宿主消费同一份规格打下地基。
《计算机图形学》卷一《几何、变换与光栅化》目录:16 章 48 节,把渲染从 API 调用还原成可算的整数——Q16.16 定点顶点变换、整数边函数覆盖判定、定点重心插值、深度缓冲、裁剪、抗锯齿与纹理映射全部定点实现,让 Python 与 TypeScript 产出逐字节相同的 PNG。本页给出与站内既有内容的分工、六档可运行性口径、《烛影山谷》场景总览与全书 16 章 48 节完整清单。
《计算机图形学》卷一《几何、变换与光栅化》全 50 篇。第一部分(第 1–4 章)把渲染还原成整数:渲染的最小模型与场景规格字段、最小渲染器骨架,向量运算的定点化与齐次坐标,模型/视图/投影矩阵与 MVP 合成,旋转矩阵、四元数与朝向插值;第二部分(第 5–8 章)处理从世界到屏幕的每一步:针孔相机与透视正交投影、视锥与近远平面,整数边函数与覆盖判定、重心坐标插值、深度插值与 z-buffer,DDA 与 Bresenham 及直线光栅化的误差界,视锥裁剪与近平面多边形重建;第三部分(第 9–13 章)做可见性与数值一致:背面剔除与朝向的精确判定、深度缓冲的精度分布与逆转 z、采样定理与 MSAA 的 CPU 实现、UV 与透视校正插值及 mipmap,最后把定点与浮点的分歧、边函数规则的整数化、跨语言逐位一致做成可验证的判据;第四部分(第 14–16 章)把中间缓冲可视化并装配成完整管线,做三种消费的联调并交付卷二。按章节提供仿真、逻辑内核与原型;配套工程与累计快照已有验证;具体范围以对应目录说明为准,按章复现、全部事实与练习另行验收。全书围绕程序化场景《烛影山谷》与工具链 lantern 展开。
沿渲染管线逐级展开图形学核心概念:从模型视图投影矩阵与齐次坐标的变换链,到 Lambert、Phong、Blinn-Phong 光照模型与 BRDF 入门,再讲纹理映射与 Mipmap 采样、深度缓冲与 Z-fighting、背面剔除与视锥裁剪,并对比光栅化与光线追踪两种范式,最后落到着色器职责、伽马校正与 MSAA 抗锯齿。
渲染管线是现代 GPU 执行 3D 图形绘制的核心流水线,从应用程序提交顶点数据到屏幕上呈现像素,其间经历了顶点处理、图元装配、光栅化、片段处理和输出合并等多个阶段。本文从理论层面深入讲解渲染管线的每个阶段、各阶段的数据流变换、现代 GPU 的并行执行模型,以及与实时光线追踪管线的对比。