计算机图形学 21:光怎样经过多次反射
白色地板靠近红墙时,为什么会带上红色?只计算“地板直接看见白灯”的路径,地板仍是灰白的。要产生墙面的颜色影响,还需要计算灯先照到墙、墙再照到地板的贡献。
本篇把第 18 篇的最近交点、第 19 篇的反射积分和第 20 篇的随机估计接起来。场景只有一个开口盒子,除顶灯外都是 Lambert 表面。颜色渗透用墙色对照与线性数值检查,路径终止则另有可手算的控制实验。
从相机方向逐段估计入射光
相机射线先找到表面 x。它向相机发出的光包含自身发射,也包含来自其他方向的反射。对反射积分抽取一个方向 ω,沿该方向再求最近交点 y,就把 x 的未知入射光转成了 y 向 x 的出射光。
这条计算路径从相机出发,与通常描述的“光从灯传播到相机”方向相反。它是一种积分求解顺序,不是宣称真实光子从相机射出。每次只延长一个随机方向,形成一条路径;重复多条路径再平均。
用 β 保存到当前顶点之前的累计权重,初值为 RGB 三个通道的 1。采到下一段方向后更新:
其中 PDF 相对于立体角定义。命中发光表面时,累加 βLₑ。本篇没有另采灯面,也没有下一事件估计,所以不需要在两种采样策略之间加 MIS 权重;这一部分留到下一篇。
辐亮度沿当前无介质、无遮挡的线段传播,不额外乘距离平方倒数。灯的远近会通过其张开的立体角影响随机方向命中概率;再次乘 1/r² 会把这个几何影响重复计算。
Lambert 表面怎样抽方向
取两个均匀数 u、v,令 r=√u、φ=2πv,先在局部坐标构造:
它可以理解为均匀圆盘样本投影到正半球,方向的立体角密度为 pω=cosθ/π。代码选择不平行于法线的辅助轴,用叉积构造正交基,再把局部方向转换到世界空间。
Lambert 的 fᵣ=ρ/π,与该 PDF 配合后,吞吐量更新约成 βnew=βρ。余弦和 π 被比值抵消了,并不是实现忘记了投影项。如果换成均匀半球采样,仍然只乘 ρ 就会算错。
cosine_direction 在 +Z、+Y、−X 三种法线下各测试 65,536 个方向,检查单位长度和正半球。合并后的平均 cosθ 为 0.666057,解析值为 2/3,检查容差为 0.003。几何检查与分布矩检查各自回答不同问题,不能只看方向长度就认定分布正确。
方向随机数复用第 20 篇的开区间生成方式。固定种子使本机实验可重复,有限伪随机序列仍不等于连续概率模型的独立实数样本。
五个面组成一个可追查的盒子
盒子范围为 [−1,1]³,前面 z=1 开口,外部为黑色。其余五面由十个三角形组成,法线全部朝内;求交仍用原有 BVH。表面是单面的,命中背面不会继续反射。
顶面 y=1 全部发白光,Lₑ=(4,4,4),反射率为零。地板和背墙反射率为 (0.65,0.65,0.65),左墙为 (0.7,0.1,0.1),右墙为 (0.1,0.7,0.1)。这里用线性 RGB 近似颜色传输,没有光谱积分、玻璃或参与介质。
每次散射后,射线起点沿内向法线偏移 10⁻⁷ 个场景单位,减少自身求交。这个值针对边长 2 的盒子;它不是对任意尺度几何都稳健的误差界,第 17 篇讨论的偏移局限仍然存在。
相机位于 (0,0,3.2),看向原点,垂直视场角 0.75 弧度。输出 96×96 像素,每像素 256 条路径,图像种子固定为 20260920。每个像素的主光线都通过像素中心,仅后续散射随机化,因此这里没有验证像素面积抗锯齿。
深度数的是哪些顶点
固定深度 D 表示最多访问 D 个命中表面,相机本身不计入。D=2 允许“相机→地板→灯”,只有一次漫反射;D=4、8 允许更多表面反射后再到灯。达到上限时,当前表面的发光仍会累加,但不再向后延长。
程序把直接看见灯,以及一次表面反射后看见灯,合并在 direct 字段;更长的发光路径进入 indirect。因此图像中的 direct 并非只含反射项。下文探针第一步必定命中地板,其 direct 才纯粹对应地板的直接照明。
固定 D 遗漏所有更长路径。只要这些路径还有非零贡献,估计就有截断偏差。样本数增加只能降低当前截断模型的噪声,不会补回被深度规则禁止的路径。
D=2 实际结果:
D=8 实际结果:
图中白色地板与背墙在多次反射后受到彩墙影响。不能仅凭更亮、更平滑就判断正确;下面的控制实验保持几何和光源不变,只改变墙色。
颜色渗透怎样排除材质本身的变化
探针从 (−0.65,−0.8,0) 沿 −Y 发射,命中靠近左墙的同一个地板位置。地板反射率始终为灰色。对三种墙面配置、四种终止方式,分别运行种子 1 到 8,每次 16,384 条路径,得到 96 行原始记录。
三种配置为红左绿右、双灰墙 (0.3,0.3,0.3)、绿左红右。没有按当前误差提前结束。相同终止策略和种子下,这些配置消耗相同随机数;原始数据逐组检查直接光完全相同,交换墙色则使间接光的红绿通道精确交换。
| D=8 的墙面配置 | 间接 R | 间接 G | 间接 B |
|---|---|---|---|
| 红左绿右 | 0.22840410 | 0.14481356 | 0.08742002 |
| 双灰墙 | 0.15494382 | 0.15494382 | 0.15494382 |
| 绿左红右 | 0.14481356 | 0.22840410 | 0.08742002 |
这些是八次运行的线性均值,尚未色调映射。全部三种配置的 D=8 直接分量均为 (0.55389252,0.55389252,0.55389252)。探针靠左,左侧颜色对间接分量的影响更强;换墙色后影响随之交换,地板参数从未改动。
PNG 则先把线性值按参考辐亮度 1 归一化,再应用 u/(1+u) 和 sRGB 编码。显示映射与量化改变了通道关系,定量判断必须读取映射前的 CSV,不能从截图反推高精度比值。
随机终止为什么必须补偿
俄罗斯轮盘在本篇的第三次散射及以后,每次以 s=0.8 的概率继续。若继续,β 除以 s;否则结束。对于还未计算的后续贡献 C,条件期望为 s×C/s+(1−s)×0=C。
这并不让每条路径的能量都保持原值,而是让保留下来的路径代表被丢弃路径的统计份额。省略除法会系统性变暗。RR 也不保证降低方差,它首先改变的是计算量分配与终止方式。
当前 RR 没有正常的固定深度截断。为防实现失控,4096 层是紧急保护限,触发后直接让实验失败,不返回一个截断结果冒充成功。本次探针 RR 最长访问 23 个表面,保护限未触发。理想概率模型下,每次都有固定非零终止概率,路径几乎必然有限。
RR 实际图像如下:
不同终止策略消耗的随机数数量不同,即使种子相同,也不构成逐路径配对。三幅图都使用相同分辨率和每像素路径数,没有计时,因此不能据此比较单位时间画质。
用几何级数单独检查终止逻辑
先离开几何场景,计算 S=1+1/2+1/4+…=2。固定保留 D 项得到 2(1−0.5ᴰ),D=2、4、8 分别为 1.5、1.875、1.9921875,截断偏差可以直接算出。
随机版本每次先加入当前项,再以 s=0.75 决定是否继续;幸存权重乘 0.5/s。它复用路径代码的 roulette 补偿函数。另运行一个故意不除 s 的错误版本,其期望为 1/(1−0.5s)=1.6。
每个种子运行 65,536 次完整级数估计,共八个种子。正确版本的跨种子均值为 1.99910149,均值标准误为 0.00111921;错误版本为 1.59945847,标准误为 0.00058730。两者分别与 2 和 1.6 相符。
这个实验能发现生存补偿错误,却不能独自证明盒子绕序、法线或发光方向正确。它与场景控制实验共同构成证据,不能相互替代。
固定深度与 RR 的差别有多大
对红左绿右探针,总辐亮度的跨种子均值和标准误如下。标准误按八个完整运行结果的样本标准差除以 √8 计算,不把同一次运行内部的所有路径都当成八次试验。
| 终止方式 | 总 R ± SE | 总 G ± SE | 总 B ± SE |
|---|---|---|---|
| D=2 | 0.551532 ± 0.001991 | 0.551532 ± 0.001991 | 0.551532 ± 0.001991 |
| D=4 | 0.753763 ± 0.003645 | 0.686020 ± 0.003491 | 0.636780 ± 0.003795 |
| D=8 | 0.782297 ± 0.002161 | 0.698706 ± 0.002405 | 0.641313 ± 0.002546 |
| RR | 0.788720 ± 0.001968 | 0.702413 ± 0.001917 | 0.645239 ± 0.002047 |
对每个种子先计算 RR−D,再对八个差值统计,RR−D2 的 R 均值为 0.237188,标准误 0.003304;RR−D8 的 R 为 0.006423,标准误 0.002467,G 为 0.003707±0.002207,B 为 0.003926±0.002874。
D=2 的缺失贡献明显,D=8 与 RR 的差异已经接近当前实验的统计波动尺度。不能把 D=8 称为无偏真值,也不能由有限样本差值精确测出无限路径尾项。使用相同种子计算差值只规定了比较方式,没有把不同终止路径强行当作相同样本。
复跑与练习
1 | |
核心代码为 path_trace.hpp,实验驱动为 path_check.cpp。可下载96 行探针记录、36 行跨种子汇总和八次终止实验。完整日志、图像范围检查与摘要保存在 writing-plans/computer-graphics/evidence/21-*.txt。
练习一:Lambert 表面改用均匀半球 PDF=1/(2π),每次吞吐量应乘什么?
答案:乘 (ρ/π)cosθ÷[1/(2π)]=2ρcosθ。只有与余弦 PDF 配对时才能约成 ρ。
练习二:RR 以 0.8 概率继续,但幸存时不除 0.8,经过三次这样的选择后,后续项的期望被乘了多少?
答案:乘 0.8³=0.512。增加路径数量会更稳定地估计这个错误期望,不会修复变暗。
练习三:为什么同一个白色探针在彩墙、灰墙实验中直接光一致,间接光不同?
答案:直接路径只涉及相机、地板与白灯,几何和这两种表面没有变化;间接路径包含墙面反射,吞吐量会乘墙面的不同 RGB 反射率。
系列导航与资料
前篇:20:随机样本怎样估计积分。系列入口。下一篇:22 小光源为什么难以采样。
PBRT 第四版 §13.2.3核对增量路径构造;§13.4核对吞吐量更新,但该教材实现同时含 maxDepth,不据此宣称其完全无截断;附录 A.5.3核对余弦半球分布;§2.2.4核对俄罗斯轮盘补偿。实际核验于 2026-09-20,具体位置与独立控制推导见 research-21.md。






