计算机图形学 28:实时材质怎样近似离线光照
一个黑色物体挡住天空时,附近的漫反射表面会变暗。若实时着色只按法线查询预计算的环境光,同一法线在遮挡物附近和远处得到相同的入射光,阴影就会缺失。两张图即使颜色接近,也可能没有计算同一组光路。
本篇固定环境图、材质、相机与曝光,比较 GPU 的漫反射环境 IBL 和 CPU 的带可见性路径采样。选用能解析积分的简单环境,先验证预计算和着色器,再解释真实遮挡造成的模型差异。第 23 篇的 GGX 与折射模型保持原有含义,本实验明确选择 Lambert 材质,不把漫反射结果外推到金属或玻璃。
同一个场景的两个光照模型
打开环境光照对照。点击“运行GPU并核对CPU”,再切换 GPU IBL、CPU 路径参考与线性差异三种视图。“CPU路径参考”只通过 GPU 显示已有 CPU 数据,没有在浏览器中执行 GPU 路径追踪。
接收体为原点处的单位球,RGB 反射率固定为 (0.65,0.55,0.45)。黑色遮挡球中心 (0.55,0,1.6),半径 0.35,反射、透射与自发光都为零。它实际参加 CPU 射线求交,不是最后在图片上涂出的黑圆。
正交相机从 z=4 沿 −z 观察,图像覆盖 x、y 各 [-1.2,1.2],64×64 像素中心取样。场景沿用右手系与线性 RGB,+y 向上。屏幕背景固定黑色;本组图只比较表面反射,没有显示相机直接看到的环境背景。
遮挡球最低 z 为 1.25,接收球最高 z 为 1,因此当前相机下遮挡球完全位于接收球前方。GPU 可以用投影圆判断主视线遮挡,同时解析计算接收球法线。若移动遮挡球到接收球内部或后方,这个判断就不成立,必须改成完整的最近交点比较。
环境使用每通道辐亮度:
方向 ω 为单位向量,环境没有距离衰减。各通道满足 a≥|b|,所以整个球面的辐亮度非负。蓝通道的 b 为负,只表示 −z 一侧蓝光更强,不是负的入射能量。
环境图的实际显示如下。顶部对应 +z,底部对应 −z;图中经过压缩和 sRGB 编码的颜色仅用于观看,预计算使用原始线性函数。
预计算究竟积了什么
Lambert 表面的 BRDF 是 ρ/π。无遮挡时,入射辐照度为:
这里 n 和 ω 都是单位向量。常量项的余弦半球积分为 π。方向一次项可利用旋转对称性推导:向量积分 ∫ω(n·ω)dω 必须沿 n,令其为 cn。再与 n 点乘,得到:
所以对这个环境,无遮挡结果精确为:
RGB 运算逐通道进行。E 是辐照度,Lₒ 是出射辐亮度;两者不能直接比较。Ramamoorthi 与 Hanrahan 的原论文式(2)写的是 radiosity B=ρE,不是这里的 Lₒ。本篇预计算参数表示环境辐亮度的低阶系数,着色器再乘卷积增益与反射率,没有隐含额外的 π。
从环境图投影到四个系数
程序把环境函数采在经纬网格中心。行数 H、列数 2H,角度定义为 θ=πv、φ=2πu,方向为 (sinθcosφ,sinθsinφ,cosθ)。顶行靠近 +z,两侧横向接缝对应同一方位角。
经纬像素在极区占据的固体角更小。直接平均所有像素会让极区拥有过大的权重。每格实际采用:
全部面积应相加为 4π。这个面积权重是精确的,但每格仅用中心辐亮度近似内部函数,所以整个积分仍有离散误差。PBRT 第四版的图像无限光使用等面积八面体映射;本篇的经纬布局是独立选择,不能把两种换元规则混用。
对基函数 1,ωx,ωy,ωz,环境系数取:
因为 ∫ωⱼ²dω=4π/3、不同一次项的乘积积分为零,这个投影能恢复本例的常量和方向一次项。运行时只需:
GPU uniform 存四组 RGB 系数和一组反射率,每组按 vec4 的 16 字节布局放置;控制区另占 16 字节,总计 96 字节。CPU 上传的是环境参数,没有把最终 IBL 像素当作实时着色结果上传。
本环境只含零阶与一阶,因此四组系数足够。一般环境还含更高频项,四项投影就会有截断误差;原论文讨论漫反射 irradiance 的九系数近似,也不是任意环境都严格无误差。本篇没有实现镜面预过滤、BRDF 查找表或粗糙玻璃环境采样。
黑色遮挡删掉了哪些光路
路径参考计算同一环境积分,但保留可见性:
从接收点沿方向 ω 发出射线,未命中遮挡球时 V=1,命中则 V=0。程序复用第 17 篇的球求交与第 21 篇的余弦方向采样,起点沿法线偏移 10⁻⁷。这个偏移只服务于单位尺度场景,不是任意尺度的鲁棒误差界。
余弦采样密度 p=cosθ/π,与 Lambert 的余弦和 π 抵消,所以一个样本的贡献是 ρLenvV;固定 N 条路径取平均。这不是在着色结果上套一个经验性的“阴影颜色”。
当前模型只有一个凸接收球和一个黑球。接收球外向正半球的射线不会再次命中自身,命中黑球后也没有反射或透射。因此每条有效非零路径只需一次表面散射,增加允许反弹次数不会引入新的非零贡献。
这个结论依赖几何和材质。凹面、多个反射物体、带反射的遮挡体都可能产生间接光,不能把本实验的一次散射参考推广成这些场景的完整解。法线索引的 IBL 还忽略局部位置差异与近场光源;旋转法线能改变结果,移动到同法线但不同遮挡的位置则不会改变预计算查询。
结果中的三种误差
CPU 预计算分别使用 32×16 与 128×64 环境图,在 +z、−z、+x 和 normalize(1,2,3) 四个法线处对照解析结果。细网格固体角总和为 12.5663706144,符合 4π 检查。
| 检查 | 实测线性结果 |
|---|---|
| 粗环境网格最大绝对误差 | 0.000351434 |
| 细环境网格最大绝对误差 | 0.0000217662 |
| GPU 与 CPU 相同预计算的最大差 | 0.000000207839 |
| GPU IBL 与带遮挡路径图的 MSE | 0.000177293 |
前两行是离散投影到解析结果的差;第三行是两种实现对同一投影的差;第四行混合了遗漏遮挡的模型差异和有限样本噪声。它们不能统一称为 GPU 误差,也不能拿第四行评价着色器是否正确。
CPU 与 GPU 的线性逐像素容差设为 2×10⁻⁵,实际最大差约 2.08×10⁻⁷。错误控制把 2/3 改成 1,真实 GPU 最大差变成约 0.0541585,明显超过判据。负对照后再次显示正常 IBL,可恢复正确画面。
本次真实设备报告 vendor apple、architecture metal-3、安全上下文 true,device 与 description 为空,不据此猜具体 GPU 型号。没有进行性能比较,也没有把 CPU 图片显示成功当作 GPU 算法验收。
随机探针位于 normalize(0.4,0.4,1),法线与位置相同。种子 1–8,每个 131,072 个余弦方向,无遮挡和有遮挡两条路径使用相同随机序列;固定次数结束,没有按结果提前停止。
无遮挡红通道八次均值为 0.354268809,均值标准误约 0.0000522024,解析值为 0.354292064。有遮挡的八次均值约 0.305123392。每个种子的遮挡结果都不超过同序列无遮挡结果,这个逐样本非负关系比看图片是否变暗更明确。
标准误来自八个运行均值的样本标准差除以 √8,不是严格误差界。解析对照用于检查无遮挡估计器;有遮挡数值没有独立解析真值,不能因为八次均值相近就宣称精确。
图片为什么仍然有噪点
下面两张是程序生成的相同场景。路径图用种子 20261001,每个可见着色像素 2,048 条路径,按行序消费一个 mt19937 流,固定次数结束。图像像素中心不抖动,也不做边缘抗锯齿。
两图中直接可见的黑球位置相同。路径图在黑球附近的接收表面更暗,来自被遮掉的环境方向;IBL 仍按同样法线取得无遮挡结果。黑圆本身是主视线几何遮挡,附近暗区才是入射光可见性差异。
差异图先算线性 RGB 绝对差,再统一乘 10。远离遮挡也有较小随机噪点,不能把每个亮点都解释为模型遗漏。两图共 1,970 个可见接收体像素;CPU 计算的线性 MSE 为 0.000177292937,GPU 的同口径结果为 0.000177292869。这里没有用八位显示图计算 MSE。
所有普通图先用 L/(1+L) 压缩,再经 sRGB 编码,曝光固定为 1。差异图使用同样显示变换,但它已乘 10;不能从其亮度倒推原始误差,也不能通过分别调两图曝光来隐藏模型差异。
练习与复跑
练习一:常量天空。 令 b=0,ρ=0.6,环境辐亮度为 1。E 与 Lₒ 分别是多少?如果着色器把 E 直接乘 ρ,结果错在哪里?
解题要点:E=π,Lₒ=0.6。直接把 ρE 当作辐亮度会得到 0.6π,漏掉 Lambert BRDF 中的 1/π;ρE 可对应 radiosity,必须先说明被计算的量。
练习二:为什么不能平均经纬像素? 同样宽高的极区像素与赤道像素,哪个对应的固体角更小?将环境网格加密,能否消除忽略可见性的误差?
解题要点:极区更小,应按 Δφ(cosθ₀−cosθ₁) 加权。加密能减少数值求积误差,不能把 V=1 改回真实遮挡;这是模型条件的差异。
练习三:增加反弹次数。 将黑球改成反射率 0.5 的灰球,原来“单次散射已经包含全部非零光路”的解释还成立吗?
解题要点:不成立。接收球可能收到经灰球反射的环境光,灰球也可能再收到接收球反射;应增加路径追踪模型及相应收敛验证。只把 V 从零改成灰色系数不能替代这些方向、位置与多次散射。
复跑入口为 examples/computer-graphics/ibl28_check.cpp 与 gpu28.html:
1 | |
生成的 ibl28.json 保留四组系数、CPU IBL 与路径参考线性像素;探针原始八次结果见 ibl28-probes.csv。浏览器数据参数应指向本次生成的 JSON。累计检查包含帮助命令和缺参数拒绝,构建输出不作为源文件提交。
参考资料与导航
- Ramamoorthi 与 Hanrahan 2001 原论文,§2 式(1)、(7)–(9) 的卷积增益,§3.1 式(10) 的环境投影;同篇明确无遮挡与近场光照边界。
- PBRT 第四版 §9.2与§4.3.1,Lambert 模型与反射积分。
- PBRT 第四版 §12.5与§13.1,无限环境光、可见性及更多散射。
- PBRT 第四版附录 A.5.3,余弦半球采样。实际核验与验收见仓库
writing-plans/computer-graphics/evidence/research-28.md、28-review.md。
系列入口 · 上一篇:实例化与批次 · 下一篇:关键帧与四元数。






