13.1 定点与浮点的分歧
把同一份《烛影山谷》规格分别喂给 Q16.16 定点管线与 float64 镜像管线:矩阵链最大元素差 5.007e-04,132/487 个顶点的屏幕坐标或深度不同;给定同一条整数坐标时两种光栅化器的像素缓冲逐字节相同,端到端则分歧 153 个像素并给出位置分布与通道差直方图。
tag
把同一份《烛影山谷》规格分别喂给 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 两份实现逐字节对齐。
1.1 的脚本能用,但四步糊在一个 main 里。本节把它重构成规格、几何、屏幕坐标、像素四段,每段一个有名字、可单独调用的函数,再串起来渲染《烛影山谷》的第一帧并逐段计时;同时说明 S 层与 P 层如何共用同一份规格,做到像素缓冲逐字节相同。
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 展开。
移动 GPU 与桌面 GPU 的架构差异巨大:TBDR 把屏幕分块、用片上内存完成像素处理,使得「带宽」而非「算力」成为第一瓶颈,同时散热与电池又给持续性能套上枷锁。本文从 TBDR 架构讲起,剖析带宽拆解与纹理压缩、Overdraw 与 Early-Z、动态分辨率与可变速率着色,并给出功耗与热节流的治理策略和一份可执行的优化清单。
符号距离场(SDF)用「到最近表面的有符号距离」隐式地描述几何体,天然支持光滑布尔运算、无网格变形与解析求交。本文从 SDF 的定义与组合运算讲起,剖析 Raymarching 球体追踪求交、网格到 SDF 的烘焙算法与存储格式,并覆盖它在字体渲染、软阴影、全局光照与碰撞检测中的落地,最后给出性能与精度权衡。
当场景有上百个动态光源时,传统前向渲染要为每个物体遍历全部光源,延迟渲染又受限于 G-Buffer 带宽与透明度处理。集群前向渲染(Clustered Forward / Forward+)把视锥切成三维簇,为每个簇预计算光源列表,让着色时只遍历真正影响该片元的光源。本文讲解 Tiled 分桶、Clustered 三维切分、光源分配数据结构与着色阶段查找,并给出性能取舍。
着色器不是直接丢给 GPU 执行的源码,而要经过预处理、解析、语义分析、优化、生成中间表示、再翻译成各平台后端代码的完整链路。本文拆解 SPIR-V 中间表示的结构与反汇编方法,讲解 glslang/DXC/glslc 离线编译工具、SPIRV-Cross 跨后端翻译、运行时管线缓存与变体管理,以及 WebGPU 通过 Naga 走 WGSL 的另一条路径。
渲染性能优化不能靠猜:必须先用工具定位是 CPU 瓶颈还是 GPU 瓶颈,再细分到填充率、带宽、占用率还是延迟。本文梳理 GPU 剖析与调试的完整工具链,覆盖 RenderDoc/PIX/Nsight 帧捕获、硬件计数器与带宽计算、时间线与异步队列分析、校验层与着色器调试,以及如何在引擎里内置可剖析的 GPU 计时与统计 HUD。
渲染图(Render Graph)把一帧的渲染流程抽象成 Pass 与资源的依赖图,由框架自动推导屏障、管理瞬态资源生命周期、做内存别名复用并调度异步计算队列。本文从手工管线的痛点讲起,剖析资源抽象、依赖推导、屏障生成、瞬态内存别名与帧调度机制,并对比 Unreal RDG、Unity SRP 与 Frostbite FrameGraph 的落地差异。
按领域与学习阶段整理的在线电子书与创作手记。覆盖 Rust、Lua、TypeScript、Python、Java(Spring Boot)、Go、AI Agent、MMO 服务器开发(Go 主线 + Java 21 双栈对照,四卷本 180 篇)、游戏开发(含 Cocos 四卷本与《游戏引擎实现原理》四卷本)、SLG 游戏产品设计(产品架构与经济系统 + 数值平衡与商业化运营,两卷本 100 篇)、小游戏开发实战(市场品类与产品设计 + 引擎实现与体验打磨 + 上线变现与长线运营 + 商业运营实战 + 跨平台发行与出海,五卷本 250 篇)、游戏美术与技术美术(美术制作与视觉规范 + 技术美术与管线工程 + 风格与品类美术实战,三卷本 150 篇)、游戏设计(玩法机制与可执行规格 + 策略、涌现与体验度量 + 原型、可玩性与品类,三卷本 150 篇)、计算机图形学(几何、变换与光栅化 + 着色、光照与纹理 + 光线追踪与全局光照,三卷本 150 篇)、叙事策划与叙事工艺(叙事结构与可执行规格 + 叙事引擎与分支系统 + 叙事体验与路径度量,三卷本 150 篇)与文学创作,从阅读指南进入,或按全书目录查找章节。