<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《计算机图形学》卷三《光线追踪与全局光照》· 全书目录与章节索引（50 篇） on PlumePHP</title><link>https://plumephp.com/posts/books/%E5%85%89%E7%BA%BF%E8%BF%BD%E8%B8%AA%E4%B8%8E%E5%85%A8%E5%B1%80%E5%85%89%E7%85%A7/</link><description>Recent content in 《计算机图形学》卷三《光线追踪与全局光照》· 全书目录与章节索引（50 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sat, 17 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://plumephp.com/posts/books/%E5%85%89%E7%BA%BF%E8%BF%BD%E8%B8%AA%E4%B8%8E%E5%85%A8%E5%B1%80%E5%85%89%E7%85%A7/index.xml" rel="self" type="application/rss+xml"/><item><title>《计算机图形学》卷三《光线追踪与全局光照》目录</title><link>https://plumephp.com/cg-trace-toc/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-toc/</guid><description>《计算机图形学》卷三《光线追踪与全局光照》目录：16 章 48 节，把光还原成一个可估计的积分——光线求交与 BVH、阴影反射折射、蒙特卡洛积分与方差、路径追踪与渲染方程、重要性采样与多重重要性采样、辐射度与光子映射、体积渲染与 ray marching、SDF、收敛度量与停止准则，最后做跨语言数值一致与三卷总收官。本页给出分工、六档可运行性口径、卷三新基线与全书 16 章 48 节完整清单。</description></item><item><title>《计算机图形学》卷三《光线追踪与全局光照》附录 A · 渲染算法公式、参数表与数据集索引</title><link>https://plumephp.com/cg-trace-appendix-a/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-appendix-a/</guid><description>《计算机图形学》卷三《光线追踪与全局光照》附录 A：全卷共用的定点常数表（EPSILON、TRI_STRIDE、BVH 叶子容量、SplitMix64 的四个常数）、光追中间量的实测位宽上界（为什么 TS 侧必须全程 BigInt）、十个渲染算法的整数形式速查、采样与收敛参数表、三卷基线 sha256 与误差汇总，以及各章产物的数据集索引与复现命令。所有数字来自本机实跑。</description></item><item><title>1.1 光线的表示与求交</title><link>https://plumephp.com/cg-trace-01-1-ray-representation-intersection/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-01-1-ray-representation-intersection/</guid><description>光线就是 o + t·d，求交就是把这个参数式代进一个隐式方程解出 t。本节用同一条探针光线对球、地面、三角形三种原语各求一次交：76800 条主光线归一化残差最大 5 Q16.16，命中 43731 个像素，三种 F(p) 残差分别是 712、0、-29。</description></item><item><title>1.2 相机与主光线</title><link>https://plumephp.com/cg-trace-01-2-camera-primary-ray/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-01-2-camera-primary-ray/</guid><description>相机三根基向量必须从 mat_look_at 的视图矩阵取行（第 0/1/2 行即 s / u / -f）。底座原先取列，把 up 的 z 与 back 的 y 各反一号，相机是歪的。判据是主光线命中掩码与卷一光栅化覆盖掩码的逐像素差：取行 43731 只差 4 个，取列 21519 差 22212。像素再经 NDC 与 4:3 宽高比合成主光线方向。</description></item><item><title>1.3 递归与深度限制</title><link>https://plumephp.com/cg-trace-01-3-recursion-depth-limit/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-01-3-recursion-depth-limit/</guid><description>底座的 trace 把 depth 一路传下去，却不把入射方向传给 shade。本节写一个与它逐字同构、只多传一个 dirv 的 trace_rec，给着色器加一层受深度门控的镜面反射：深度 1 的输出与卷三基线 sha256 逐字节相同（退化为直接光照），每加一层 MAE 与变化像素都单调下降。</description></item><item><title>10.1 噪声的构造</title><link>https://plumephp.com/cg-trace-10-1-noise-construction/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-10-1-noise-construction/</guid><description>噪声在本章不是纹理而是几何的生成器，所以同一个 (ix, iz, seed) 必须给出同一个整数。本节用同一个 32 位混合哈希派生出值噪声与梯度噪声：128 点扫描线上均值 31041、标准差 14919，16384 个格点低 16 位的碰撞率 117.4‰，整数插值与 float64 参照的最大偏差只有 1 个 Q16.16。</description></item><item><title>10.2 分形与地形</title><link>https://plumephp.com/cg-trace-10-2-fractal-terrain/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-10-2-fractal-terrain/</guid><description>一个 octave 的噪声撑不起地形，fBm 按 gain^k 的振幅把它叠起来。本节用左移采样坐标实现 lacunarity=2、用 Q16.16 连乘 gain，全程整数：4 层高度场幅 132654，octaves=1 时逐位等于底座值噪声，与 8 层参照解的最大偏差 7551，结构函数斜率收敛到 0.533。</description></item><item><title>10.3 程序化场景的生成</title><link>https://plumephp.com/cg-trace-10-3-procedural-scene/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-10-3-procedural-scene/</guid><description>程序化场景要能当资产用，靠的不是看起来像，而是可断言：同一 seed 必须给出同一场景。本节把 fBm 位移与噪声分档材质接进既有 scene_spec，基线帧 sha256 逐字节锚定 213b4130…，程序化场景的几何 digest 与帧 sha256 在同 seed 重跑下不变、换 seed 必变。</description></item><item><title>11.1 SDF 的构造与布尔运算</title><link>https://plumephp.com/cg-trace-11-1-sdf-construction-boolean/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-11-1-sdf-construction-boolean/</guid><description>距离场要被 sphere tracing 当步长信任，必须同时满足下界性与 Lipschitz 界。本节用 40000 对随机点估计八个场的 Lipschitz 常数：球、盒、平面、交、差都落在 1000.0‰ 附近，高度场却到 1084.1‰；下界性实测球/盒/平面/并集的最大 f-d_true 恰为 0，高度场 648 个采样点里 426 个高估，最坏 3909 Q16.16。</description></item><item><title>11.2 ray marching 求交</title><link>https://plumephp.com/cg-trace-11-2-sdf-ray-marching/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-11-2-sdf-ray-marching/</guid><description>sphere tracing 每一步走多远由场值自己决定，于是三件事必须量：迭代次数怎么分布、容差 eps 取多少、步长放大到几倍会出事。3072 条主光线的实测是解析命中 2048、marching 命中 1995、真漏交 0；无地面场景里场放大 1.1 倍只穿透不漏交，1.25 倍漏交 303.0303‰，1.5 倍直接 1000‰。</description></item><item><title>11.3 SDF 的法线与软阴影</title><link>https://plumephp.com/cg-trace-11-3-sdf-normal-soft-shadow/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-11-3-sdf-normal-soft-shadow/</guid><description>有了求交点，法线靠差分、软阴影靠沿光取样，两者都不是免费午餐：差分步长 h 太大会跨过棱角、太小会被定点量化吃掉，实测中心差分在 h=64 时均值 0.0342 度；软阴影有一个系统性平面偏置 k*sin(theta)，k 必须超过 1/sin(theta)≈1.732 才能让开阔地面回到满亮度。</description></item><item><title>12.1 噪声与收敛的度量</title><link>https://plumephp.com/cg-trace-12-1-noise-convergence-metric/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-12-1-noise-convergence-metric/</guid><description>噪声不是「看起来脏」这种观感描述，而是一个可算的整数：同一像素在 N 个样本下是个随机变量。本节先把面光源半径取 0、N = 1 退化回卷三基线的逐字节锚点，再用 256 样本扫掠与 8 批参考解量出收敛速率——实测 log-log 斜率 -0.5027，理论值 -0.5。</description></item><item><title>12.2 参考解与误差</title><link>https://plumephp.com/cg-trace-12-2-reference-error/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-12-2-reference-error/</guid><description>误差只在有参考解时才有意义，可参考解本身也是估计量。本节用四条互相独立的量法给它造不确定度：批均值的标准误、对半拆、换种子族的第二条参考解、以及只取全程无遮挡像素的确定性网格求积。实测 1024 样本/像素的参考解相对标准误 0.005729，对半拆比值 2.045、换族比值 2.219，都与理论吻合。</description></item><item><title>12.3 采样的停止准则</title><link>https://plumephp.com/cg-trace-12-3-stopping-criterion/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-12-3-stopping-criterion/</guid><description>知道每个像素的误差量级之后，就可以让它自己决定什么时候停。本节实测三条停止准则（逐像素方差、相对误差阈值、预算上限）各跑两个最小样本数版本，量出各自停在哪、总样本数、最终误差，以及两种失效模式——四样本全零会让方差估计变成 0，于是最早停、错得最狠。</description></item><item><title>13.1 求交的容差边界</title><link>https://plumephp.com/cg-trace-13-1-intersection-tolerance-bound/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-13-1-intersection-tolerance-bound/</guid><description>把 Möller–Trumbore 的误差写成一条闭式不等式，在 43731 条命中主光线上逐条核对：界恒成立，最紧处实测/界 = 0.746916。改一处舍入规则，41254 条命中的 t 就会分叉。真正决定自交的是垂直误差 Δt·sinθ，最大 241.47 LSB，而非沿光线的 Δt。</description></item><item><title>13.2 累积的确定性</title><link>https://plumephp.com/cg-trace-13-2-accumulation-determinism/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-13-2-accumulation-determinism/</guid><description>一张图是几万次累加拼出来的：整数加法三序零差异，破坏结合律的是 fmul 的截断（结合律反例 1005/4096）。重排三角形重建 BVH 后图像摘要一字不变而访问节点数变了；全局 RNG 流下换遍历顺序 3049/3072 像素改变，逐像素流则逐字节相同。</description></item><item><title>13.3 跨语言对照</title><link>https://plumephp.com/cg-trace-13-3-cross-language-comparison/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-13-3-cross-language-comparison/</guid><description>同一份 scene_spec.json 交给 Python 与 TypeScript，像素缓冲 sha256 同为 213b4130…、五个计数逐条相同。把相机基从行换成列，命中像素从 43731 掉到 21519，两侧却依旧逐字节相同——跨语言一致抓不到「两边一起错」。再把 BigInt 换成 Number，右移只有 32 位，命中像素静默变成 8484。</description></item><item><title>14.1 两条路径的等价与分歧</title><link>https://plumephp.com/cg-trace-14-1-two-paths-equivalence/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-14-1-two-paths-equivalence/</guid><description>光栅化与光追是两条完全独立的成像路径：一个在屏幕 Q6 空间用整数边函数判覆盖，一个在世界空间用 Möller–Trumbore 求交。同一份场景下两条路径的覆盖掩码各 43731 像素、逐像素对称差 4 个，且这 4 个全落在到最近正向边距离为 0 Q6 的轮廓边上；采样点挪半个像素，同一判据立刻变差到 160。</description></item><item><title>14.2 CPU 与 GPU 的差异</title><link>https://plumephp.com/cg-trace-14-2-cpu-gpu-difference/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-14-2-cpu-gpu-difference/</guid><description>把 CPU 定点与浏览器 WebGL2 之间的差异拆成三类可归因的来源：光栅化规则（顶左规则与子像素精度）、插值方式（屏幕空间仿射对透视校正）、浮点精度（Q6/Q16.16 对 float32）。每类配一个只动一个变量的实验，并用 MAE ≤ 1.0、PSNR ≥ 30 dB、覆盖归属差异 ≤ 20‰ 三条声明容差加一个必须被拒绝的负例来收口。</description></item><item><title>14.3 一致性的判据</title><link>https://plumephp.com/cg-trace-14-3-consistency-criteria/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-14-3-consistency-criteria/</guid><description>把三类判据摆在同一帧上：跨语言逐字节一致（sha256 相等，0 容忍）、跨路径像素掩码一致（光追命中掩码对光栅化覆盖掩码的对称差等于 4 个像素）、跨宿主声明容差（MAE ≤ 1.0 / PSNR ≥ 30 dB / 覆盖差 ≤ 20‰）。再给出反直觉的结论：判据一抓不到「两侧同错」。</description></item><item><title>15.1 帧序列与动画输出</title><link>https://plumephp.com/cg-trace-15-1-frame-sequence-animation/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-15-1-frame-sequence-animation/</guid><description>离线渲染的成片是一串图，不是一张图。本节把共用相机参数接上一条纯整数相机路径，16 帧逐帧渲染并落盘 PNG 序列，用 ffmpeg 合成 GIF/MP4；实测单帧约 1.6-2.0 s、总耗时 29.1 s，逐帧重跑 16/16 帧 sha256 相同。</description></item><item><title>15.2 性能的度量与剖析</title><link>https://plumephp.com/cg-trace-15-2-performance-profiling/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-15-2-performance-profiling/</guid><description>一帧 6.7 秒，时间到底花在哪？本节把 320x240 基线的单帧耗时拆成主光线求交、阴影光线求交、着色算术、光线生成、命中处理五块，用计数而不是直觉解释它；实测阴影光线求交独占 53.68%，比主光线求交还贵，因为阴影光线大多要遍历到底去证明这一点没被挡住。</description></item><item><title>15.3 参数与质量的取舍</title><link>https://plumephp.com/cg-trace-15-3-quality-tradeoff/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-15-3-quality-tradeoff/</guid><description>把分辨率、每像素样本数、最大弹射深度、BVH 叶子容量四条旋钮各转一遍，用「相对参考解的 MAE」对「本机墙钟」给出取舍表；实测样本数在 9 spp 之后饱和（MAE 只再降 1.5463 倍），叶子容量的遍历代价在 leaf=4 处取到最小值，未达预期的组合以软告警列出。</description></item><item><title>16.1 渲染器的全链路回放</title><link>https://plumephp.com/cg-trace-16-1-full-chain-replay/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-16-1-full-chain-replay/</guid><description>把 config/scene_spec.json 到像素缓冲的八级链路逐级重放：规格摘要、相机基行口径、76800 条主光线方向摘要、BVH 511 节点高 9、命中 43731 像素、阴影光线 77211（遮挡 1357）、遍历 3238333 节点，末级 sha256 与卷三基线逐字节相同，P 层在 BigInt 里复现每一级摘要。</description></item><item><title>16.2 三卷一致性总检</title><link>https://plumephp.com/cg-trace-16-2-three-volume-consistency/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-16-2-three-volume-consistency/</guid><description>把三卷基线的 sha256、计数与容差判据并成一张表：卷一顶点光栅化 bac65977…、卷二逐像素 0d997343…、卷三主光线 213b4130…，三者命中或覆盖都是 43731 像素；再引第 13.3 与第 14.3 节的实测锚给出反直觉结论——列口径真 bug 下两个语言实现仍逐字节相同，只有掩码对称差（4 对 22212）抓得出来。</description></item><item><title>16.3 交付与后续</title><link>https://plumephp.com/cg-trace-16-3-delivery-and-next/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-16-3-delivery-and-next/</guid><description>卷三的交付账本：三卷基线 .rgb 的 sha256 逐个复核，六条计数恒等式（主光线 76800、BVH 访问 3238333 = 主光线 + 阴影光线、掩码对称差 4）逐条对账，六档可运行性各写清证明了什么；另给出已证明 4 条与未证明 5 条（真实 GPU、生产级材质、硬件光追 API 等），以及三条扰动轴的软告警。</description></item><item><title>2.1 球、平面与三角形</title><link>https://plumephp.com/cg-trace-02-1-sphere-plane-triangle/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-02-1-sphere-plane-triangle/</guid><description>三条解析求交原语——光线-球、光线-平面、光线-三角形的闭式解，连同方向与平面平行、交点在光线背后、方向与三角形共面三个退化情形一律返回 None 的口径；再用真实场景量出解析球与八面体细分网格之间的面化误差，看清网格近似在离线光追里的真实代价。</description></item><item><title>2.2 Möller–Trumbore 与数值稳定性</title><link>https://plumephp.com/cg-trace-02-2-moller-trumbore-stability/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-02-2-moller-trumbore-stability/</guid><description>Möller–Trumbore 的除法链在 Q16.16 定点下的量级实测（原始乘积到 2^49、除法分子到 2^39，故 TS 侧必须全程 BigInt）；det 趋近 0 时相对误差从 0.061‰ 涨到 46.1426‰ 的扫描，以及真实命中里为什么不能按 det 大小做 epsilon 剔除。</description></item><item><title>2.3 容差与自交</title><link>https://plumephp.com/cg-trace-02-3-epsilon-self-intersection/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-02-3-epsilon-self-intersection/</guid><description>自交与容差的边界分析：EPSILON 被两条可测量的边界夹住——下界是地形自交在 eps&gt;=16 清零，上界是场景里最小的可见几何间隙 174 Q16.16；实测丢遮挡在 eps=256 起出现，并解释为什么偏移要沿法线而不是沿光线，以及球自交为何清不干净。</description></item><item><title>3.1 包围盒与 BVH</title><link>https://plumephp.com/cg-trace-03-1-aabb-bvh/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-03-1-aabb-bvh/</guid><description>把 896 个三角形收进一棵扁平整数数组的 BVH：叶子 9 个整数、内部节点 10 个，left 等于负一是整棵树唯一的类型标签。本节立起两条不变量——父盒包含两个子盒、叶盒包含它引用的每个三角形，再把 slab 判据逐轴展开到方向分量为 0 的退化分支，全部落到实跑输出。</description></item><item><title>3.2 BVH 的构建</title><link>https://plumephp.com/cg-trace-03-2-bvh-build/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-03-2-bvh-build/</guid><description>本节拆开 BVH 的构建：划分轴为什么按最长轴选、中位数划分平均花掉 SAH 最优代价的多少倍、叶子容量从 1 扫到 32 时每条光线的访问与测试各是多少，以及排序键的除法为什么必须走 floorDiv 才能在两个宿主上复现同一棵树、而不是只复现节点数。</description></item><item><title>3.3 BVH 的遍历与代价</title><link>https://plumephp.com/cg-trace-03-3-bvh-traversal-cost/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-03-3-bvh-traversal-cost/</guid><description>把 BVH 打开、关掉、再只去掉 best_t 收缩：三个模式跑同一条代码路径、同一批 76800 条主光线，用可逐条复现的整数计数（访问节点数、三角形测试数）与逐像素比对，回答加速结构到底省掉了什么、又省得够不够多；全部结论只建立在计数上，不做速度断言。</description></item><item><title>4.1 硬阴影与阴影光线</title><link>https://plumephp.com/cg-trace-04-1-hard-shadow-ray/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-04-1-hard-shadow-ray/</guid><description>硬阴影只有「被挡住」和「没被挡住」两种结果，判据是一条从命中点指向光源的阴影光线。本节把 `off` 是沿法线的偏移向量、不是起点这件事讲透：写错一行，77211 条阴影光线的遮挡数会从 1357 涨到 77210，画面只剩环境光。最后用一张方向光掩码数出像素层面的真阴影 839 个。</description></item><item><title>4.2 镜面反射与折射</title><link>https://plumephp.com/cg-trace-04-2-reflection-refraction/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-04-2-reflection-refraction/</guid><description>反射方向 r = d - 2(d·n)n 与 Snell 折射在 Q16.16 下逐位算清：4096 组随机单位向量的单位性偏差最大 55；eta = 1.5 时 3061 组全内反射；临界角公式与整数扫描在水 / 玻璃 / 金刚石三档互证到 1–2 LSB。菲涅尔 x^5 的平方链与逐次相乘实测不逐位相同（429/4096 差 1 LSB）。</description></item><item><title>4.3 递归的光线树</title><link>https://plumephp.com/cg-trace-04-3-recursive-ray-tree/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-04-3-recursive-ray-tree/</guid><description>光线树把「反射的光线还能再反射」显式组织成一棵按深度分层的树：depth 只是透传给着色器的参数，形状由着色器决定。实测每层光线 76800 / 44877 / 9232 / 6881 / 6269，代价随深度亚线性增长（每主光线 2.686 → 3.236 条），而在某一层截断会引入单边偏差而非无偏估计。</description></item><item><title>5.1 积分与估计</title><link>https://plumephp.com/cg-trace-05-1-integral-estimator/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-05-1-integral-estimator/</guid><description>蒙特卡洛积分把「算一个积分」换成「估一个积分」：无偏估计量的均值收敛到真值，偏差则永远停在那里。本节讲清无偏性成立的条件，逐位核对 SplitMix64 的掩码语义——漏掉 `&amp; RNG_MASK` 会让输出涨到 191 位、Q16.16 采样当场失效；再用 3 分箱卡方量出取模的量化偏置：值域 2^4 时 χ² = 15677，而 64 位拒绝采样只有 1.301。</description></item><item><title>5.2 方差与收敛</title><link>https://plumephp.com/cg-trace-05-2-variance-convergence/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-05-2-variance-convergence/</guid><description>估计量的方差是 σ²/N，误差只能按 1/√N 降。本节把这条定律量成一个小数：7 档 N × 2048 条独立子流，log-log 最小二乘拟合出斜率 −0.4978，落在 −0.5 ± 0.03 内；再把 pdf 写错成 1.1，总误差被常数偏差压平到 −0.2638，而方差那条纹丝不动。</description></item><item><title>5.3 分层与低差异序列</title><link>https://plumephp.com/cg-trace-05-3-stratified-low-discrepancy/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-05-3-stratified-low-discrepancy/</guid><description>分层把立方体切成 4×4 格子，低差异序列让点自己避开彼此：同一个 d 球占比积分上，4096 个 Halton 点抵得上 7.4 万个随机点，log-log 斜率从 −0.4980 陡到 −0.7103。但这份红利随维度迅速蒸发，8 维时优势只剩 1.4 倍。</description></item><item><title>6.1 渲染方程</title><link>https://plumephp.com/cg-trace-06-1-rendering-equation/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-06-1-rendering-equation/</guid><description>渲染方程把一个像素的颜色写成第二类 Fredholm 积分方程：出射辐亮度等于自发光加上半球上入射辐亮度的积分。本节逐项拆解它，再用 Neumann 级数展成「每次弹射一项」的几何级数——双板腔真值 1.199936，截断 K 项的相对偏差恰为 (ab)^K；灯箱实测第一阶占 0.592314，第 8 阶之后只剩 0.00781676。</description></item><item><title>6.2 路径采样</title><link>https://plumephp.com/cg-trace-06-2-path-sampling/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-06-2-path-sampling/</guid><description>路径追踪把渲染方程改写成可估计的形式：方向按余弦加权采样，权重退化成 albedo 的连乘，一条路径就是一个样本。本节用确定性 SplitMix64 走完整条路径，量出 maxDepth 从 1 抬到 16 时平均亮度从 26032.93 爬到 33362.13，再用俄罗斯轮盘赌把每条路径的求交次数从 12.1170 砍到 2.7717。</description></item><item><title>6.3 无偏性与偏差</title><link>https://plumephp.com/cg-trace-06-3-unbiasedness-bias/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-06-3-unbiasedness-bias/</guid><description>截断与轮盘赌都会让图像偏离参考解，但只有一个是错的：maxDepth 硬截断丢掉 (ab)^K 的尾部能量，是偏差；俄罗斯轮盘赌的权重补偿保持期望不变，只放大方差。本节用双板腔把两条曲线分开量，截断偏差从 0.44442655 降到 0.00010173 后被定点地板挡住，轮盘赌标准差从 0.459160 涨到 5.258522。</description></item><item><title>7.1 概率密度与权重</title><link>https://plumephp.com/cg-trace-07-1-pdf-weight/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-07-1-pdf-weight/</guid><description>蒙特卡洛估计量只有一个形状 `f/p`，方差全由采样用的概率密度 `p` 决定。本节先在半球上把 `p` 归一数清楚——漏掉 `1/π` 的 `cosθ` 会得 π 而不是 1；再用 `f(x)=2x` 量三条 pdf：匹配的 `2x` 让权重恒为 1、方差恰为 0，反匹配的 `2(1−x)` 把最大权重推到 255。最后把 `fdiv` 的截断误差与除零边界摆出来。</description></item><item><title>7.2 余弦加权与光源采样</title><link>https://plumephp.com/cg-trace-07-2-cosine-light-sampling/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-07-2-cosine-light-sampling/</guid><description>同一个直接光照积分有两条采样路径：余弦/BRDF 采样与光源采样（NEE），后者要把面积测度换成立体角测度，雅可比是 `p_ω = r²/(A·cosθ_l)`。本节把总辐射功率固定、只让光源半径从 0.15 变到 0.50，量出两条路径的方差交叉：小光源下光源/余弦方差比 0.065，大光源下 6.732。</description></item><item><title>7.3 多重重要性采样</title><link>https://plumephp.com/cg-trace-07-3-multiple-importance-sampling/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-07-3-multiple-importance-sampling/</guid><description>余弦采样与光源采样各有一半场景吃亏，MIS 的做法是两条都采、再按权重函数拼起来。本节量出平衡启发式 `p_i/Σp_j` 与幂启发式 `p_i²/Σp_j²` 在三种光源尺寸下的方差：小光源与较优单路径打平（1.0447），中等与大光源分别降到 0.9053 与 0.6341；权重归一残差 ≤ 1，而幂启发式在 pdf &lt; 1/256 时下溢成 0+0。</description></item><item><title>8.1 间接光照</title><link>https://plumephp.com/cg-trace-08-1-indirect-lighting/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-08-1-indirect-lighting/</guid><description>直接光只算一次命中，剩下的能量全在多次弹射里。本节把渲染方程展开成按弹射次数排列的级数：0 次弹射差 41.4%，16 次才收敛到 0.49%。再对照自发光面积光源与环境常数两种源项——环境常数把均值调准到万分之零点二，却把漫反射像素的亮度标准差压到参考解的 45.1%。</description></item><item><title>8.2 辐射度方法</title><link>https://plumephp.com/cg-trace-08-2-radiosity/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-08-2-radiosity/</guid><description>辐射度把腔体切成有限块，用形状因子矩阵把渲染方程变成线性方程组，一次解到底。本节量三件事：质心近似 cosθi·cosθj·Aj/(πr²) 的行和缺口在 n=2 时高达 17880 ulp（27.3%），不做行归一化解会整体偏低 15~23%；Jacobi 25 轮、Gauss-Seidel 14 轮收敛到同一残差。</description></item><item><title>8.3 光子映射</title><link>https://plumephp.com/cg-trace-08-3-photon-mapping/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-08-3-photon-mapping/</guid><description>光子映射把能量当成粒子：从光源发射、在场景里弹、命中处记一笔，最后用 k 近邻密度估计在着色点还原辐照度。本节量出三个数：记录条件写成 b&gt;=1 会让天花板直接项占比从 28% 掉到 18%；r² 掉到 3 ulp 时 1/r² 的凸性把估计值推高到 +63.3%；参考解自己的噪声底就有 14.11% 的 L1。</description></item><item><title>9.1 体积渲染方程</title><link>https://plumephp.com/cg-trace-09-1-volume-rendering-equation/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-09-1-volume-rendering-equation/</guid><description>体积渲染方程把表面方程里「只在表面取值」的积分换成沿路径连续取值。本节用定点整数把三件事写成可断言的数：透射率 exp(-σ_t s) 的整数 LUT 与浮点 exp 差 2262 ppm、Henyey–Greenstein 相函数的归一化与各向异性、以及单次散射相对所有阶求和漏掉多少。</description></item><item><title>9.2 ray marching</title><link>https://plumephp.com/cg-trace-09-2-ray-marching/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-09-2-ray-marching/</guid><description>把 9.1 的连续积分换成沿光线取 N 个样点的求和，就得到 ray marching。本节把步长与误差的关系量成三张表：中点法二阶收敛直到定点地板、透射率链式累乘的偏差随 N 漂到 −5.17%、一阶近似在 σ_t·Δs ≥ 1 时透射率塌成 0 的条带阈值，以及双层介质里误差的震荡。</description></item><item><title>9.3 体积阴影与散射</title><link>https://plumephp.com/cg-trace-09-3-volume-shadow-scattering/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/cg-trace-09-3-volume-shadow-scattering/</guid><description>介质里的阴影光线不再回答「挡不挡」，而是给出一条透射率曲线；几何遮挡由 BVH 求交单独判成「乘以 0」。本节把步进搬进带遮挡体的场景，量体积阴影的解析与步进对照、单次散射与二阶散射的差（贡献 18.14%、代价近 20 倍），以及各向异性相函数一次渲染重加权出的七档 g。</description></item></channel></rss>