跳转到内容

Distributed Ray Tracing — 把所有"模糊"效果统一成随机采样

是什么

Distributed Ray Tracing(DRT)是一套让每像素打很多根带随机扰动的射线、然后求平均的渲染方法。日常类比:拍夜景,相机长曝光时间,传感器收集了一个时间段内所有光子求平均,于是运动的人就糊了。DRT 在算法里模拟同一件事——对时间、镜头位置、光源位置都做”长曝光式”的采样。

之前的 Whitted ray tracing(1980)每像素只打一根射线,得到的画面像玻璃和塑料:镜子是完美镜子、阴影是刀切边、不会动也没有景深。DRT 在 1984 年用 4 页论文证明:这些”模糊感”全部是同一道数学题——多重积分——只要在不同维度上随机采样就能一并解决

为什么重要

不理解 DRT,下面这些事都没法解释:

  • 为什么 Pixar / RenderMan / Arnold 这些电影渲染器都叫”Monte Carlo renderer”——它们的祖先就是这 4 页
  • 为什么调”景深”参数会让渲染时间从 1 分钟涨到 30 分钟——你在让积分维度从 2 升到 4
  • 为什么离线渲染图有”颗粒噪声”,加大 spp(samples per pixel)就能擦掉——这是采样收敛
  • 为什么实时 RTX / 光追游戏到 2020 年才能糊弄出软阴影——要等硬件能算够多采样

核心要点

DRT 的洞见可以拆成 三步

  1. 每个效果都是积分

    • 运动模糊 = 对快门打开的时间段积分
    • 景深 = 对镜头光圈面积积分
    • 软阴影 = 对面光源面积积分
    • Glossy 反射 = 对反射方向附近一个锥形立体角积分
    • 半透明折射 = 对折射方向一个锥形立体角积分
  2. 一根射线就是该积分的一个样本:以前 Whitted 每像素一根射线 = 用一个点近似整个积分,结果当然是”硬边”。

  3. Monte Carlo 采样:每像素打 N 根射线,每根在所有维度上都被随机扰动一次(不同的时刻、不同的镜头落点、不同的光源采样点、不同的反射方向)。最后求平均,逼近积分真值。

三步加起来叫 Distributed Ray Tracing——“distributed” 指把样本分布在多个积分维度上,不是分布式计算。

实践案例

案例 1:景深(Depth of Field)怎么实现

实拍相机:光圈大 → 焦平面外的东西糊掉。数学本质:每个传感器像素接收的光来自整个光圈面积上不同入射方向的光线。

DRT 的做法:

for 每像素 p:
for k in 1..N:
在镜头光圈面积上随机采一个点 lens_k
从 lens_k 出发、经过 p 在焦平面上对应的点,算出射线方向
沿这根射线追踪场景
像素颜色 = N 根射线结果的平均

焦平面上的物体所有 N 根射线汇聚到同一点 → 不糊。焦平面外的物体 N 根射线打到不同点 → 颜色平均出来就是糊。这就是今天 PBRT / Mitsuba / Arnold 实现 DOF 的标准做法。

案例 2:软阴影怎么得到

点光源 → 阴影是非黑即白的硬边。现实里没有点光源,灯泡有体积,所以阴影边缘有半影(penumbra)。

DRT 的做法:把光源当成一个面(如球面、矩形面),打 shadow ray 时在光源面上随机采样,N 根 shadow ray 中部分被遮挡、部分没被遮挡,平均后得到 0..1 的灰度——这就是半影

案例 3:运动模糊

每根射线带一个随机时间戳 t_k ∈ [shutter_open, shutter_close]。场景里运动的物体在不同 t_k 处于不同位置 → N 根射线打到不同位置 → 平均后得到拉丝糊。

在游戏/实时图形里这通常用后处理(post-process motion blur)伪造,因为打不起 N 根射线。离线电影渲染则用 DRT 的真采样,逐像素几十到几千根射线。

案例 4:Glossy(亚光)反射

完美镜子反射方向是确定的一根射线。亚光金属(拉丝铝、磨砂不锈钢)的反射方向是一个——以理想反射方向为轴,越偏越暗。

DRT 做法:每根射线打到亚光面后,在反射锥立体角内随机采一个方向作为次级射线方向。N 根射线得到 N 个不同的反射方向,平均后呈现”模糊倒影”。锥越宽 → 越像磨砂;锥越窄 → 越像镜子。今天 Disney BRDF / GGX 等微表面模型本质都是给这个锥指定一个概率分布。

踩过的坑

  1. “Distributed” 不是 distributed computing:1984 这个词指”分布在多个积分维度上的采样”,跟分布式系统毫无关系。中文译作 分布式光线追踪 容易让人误会。

  2. DRT 不是 path tracing:DRT 仍然按 Whitted 的方式从眼睛递归追踪,每次反射/折射仍只走一根次级射线(只是方向带随机扰动)。Kajiya 1986 的 path tracing 才把”全局光照中漫反射弹射”也变成 Monte Carlo 采样。DRT 是第一步、Kajiya 是第二步

  3. 样本不够就有颗粒噪声:N=16 时画面布满”沙粒”,N=256 才平滑,N=1024 出片质量。看上去渲染时间和画面质量是线性换——这就是后续 30 年所有降方差工作(importance sampling、MIS、bidirectional path tracing、Metropolis Light Transport)的起点。

  4. Stratified > 纯随机:每像素 N 个样本不是完全乱撒,而是把 [0,1)×[0,1) 切成 √N×√N 网格、每格内随机一点(jittered sampling)。这样空隙更均匀、收敛更快。这是论文里专门强调的工程细节。

适用 vs 不适用场景

适用

  • 离线渲染(电影、动画、特效)——时间预算大,算得起几百 spp
  • 任何需要”模糊感”才真实的效果——景深、动模糊、软阴影、glossy
  • 现代生产渲染器(Arnold、RenderMan RIS、V-Ray、Manuka、Disney Hyperion)的核心循环

不适用

  • 实时渲染(游戏、VR)——每帧 16ms 打不起几百根射线,只能用后处理伪造或 NN 降噪兜底
  • 需要保留硬边的卡通渲染(NPR)——刻意要的就是非真实
  • 不带”模糊”维度的简单场景——直接 Whitted 一根射线就够,省 N 倍时间

历史小故事(可跳过)

  • 1980 年:Turner Whitted 在贝尔实验室发表递归光线追踪,每像素一根射线,渲出来的”金属球+棋盘”图火遍图形学界。但所有人都看出问题:太硬、太干净、不像电影。
  • 1982-1984 年:Cook、Porter、Carpenter 在 Lucasfilm Computer Graphics Group(即后来 Pixar)做 RenderMan 雏形,碰到同一道墙。他们意识到所有想要的”软”效果都是某种积分。
  • 1984 年 SIGGRAPH:4 页论文,密度极高,连图都简陋。但一年内 Lucasfilm/Pixar 内部就在用。
  • 1986 年:Kajiya 在同一个会场发表 The Rendering Equation,把全局光照也写成积分,path tracing 诞生。DRT 的思路彻底胜出,成为离线渲染的范式。

学到什么

  1. “模糊”的数学本质是积分——理解了这一点,所有看似不同的渲染效果(景深、动模糊、阴影、glossy)就坍缩成同一道题
  2. Monte Carlo 是把高维积分变可解的工程钥匙——维度高到积不动?随机采样、求平均、收敛慢但终归收敛
  3. 代价是噪声,方向是降方差——后续 30 年图形学的大半工作是”怎样用更少样本得到更平滑结果”
  4. 4 页论文 + 工业需求——DRT 不是先理论后落地,是 Pixar 工程师为了拍《Andre & Wally B.》逼出来的;这是图形学最好的范式

一句话记忆法

如果只能记一句话——“每像素打 N 根带随机扰动的射线,每根扰动时间/光圈/光源/反射方向后求平均”。这一句覆盖了 DRT 90% 的工程含义。

跟今天的代码长什么样

任何一个现代离线渲染器(PBRT 教材代码、Mitsuba 3、Blender Cycles)的主循环大致是:

for each pixel (x, y):
color = 0
for k in 1..spp:
sample = stratified_jittered(k, spp) // 5+ 维度随机数
ray = generate_camera_ray(x, y, sample.lens, sample.time)
color += integrate(ray, sample) // 递归追踪 + 各种 BRDF 采样
pixel(x, y) = color / spp

spp(samples per pixel)开到 16 = 上世纪 80 年代水平,开到 1024 = 现代电影帧。算法骨架完全是 1984 这 4 页定下来的

延伸阅读

关联

  • whitted-1980 —— 祖父辈:递归光线追踪开创者,DRT 把它的”硬边”问题解了
  • kajiya-1986 —— 兄弟篇:rendering equation + path tracing 把 Monte Carlo 推到全局光照
  • reyes-1987 —— 同实验室同期工作:Pixar REYES 微多边形渲染,与 DRT 互补
  • veach-1997 —— 后辈:MIS / bidirectional path tracing 等降方差技巧的集大成

反向链接