从 PRT 到 Lumen

全局光照讲解 · 写给美术和刚入门 PBR 的人

从 PRT
到 Lumen

一盏灯照亮一面墙很容易。难的是那面墙再把光弹回房间,照亮所有灯没直接照到的角落。这份讲解从这个现象讲起,沿着二十年里的五条算法路线往下走,最后拆开 UE5 的 Lumen、5.8 新增的 Lumen Lite 和移动端的 Lumen,看它们怎么在十几毫秒里把这件事算出来。

8 个页签 · 11 章 + 四个附录 · 115 节 · 一个可以拖着看的 3D 白盒

白盒这个房间的光照是在你的显卡上实时算出来的,每一帧都在多追一批光线。拖动画面换角度,拖动"反弹次数"看间接光一层层加上去。

0.1交互图

光是怎么一次次弹开的

开头的白盒是三维的。这里换成一张剖面图,把光的路径一段一段拆开看。房间左边有扇窗,阳光从窗户进来,打在地板上,这是直接光:光源直接照到的部分。

图 0.1拖动滑块,或点"自动播放"。每多一次反弹,就有一个光点沿新的路径飞过去,照亮它撞到的表面。右侧竖条是房间的总亮度。

把反弹次数拖到 1。地板不是黑的,它把一部分光弹了出去,于是右墙也亮了。这就是间接光的第一次反弹。再拖到 2,右墙又把光弹向天花板。表面每次只能反射一部分能量,所以右侧的总亮度条每次涨的幅度都比上一次小。

全局光照(Global Illumination,简称 GI)指的就是第一次反弹以后的所有部分。把滑块拖回 0,就能看到没有它的画面:阴影里一片死黑。真实世界里不存在这样的房间,所以缺了 GI 的画面看起来总是假的。

这个过程也说明了它为什么难算。要知道右墙有多亮,得先知道地板有多亮;要知道天花板有多亮,又得先知道右墙有多亮。每个表面的答案都依赖别的表面的答案。第 1 章会把这件事写成公式,你会发现它正好是图下方那串 1 + ρ + ρ² + …。

动画为原理示意,不是真实渲染结果 · 动画在网页与演示模式下播放,导出 PPTX/PDF 时会变成静态图

第 1 次:直接光

阳光从窗户进来,打在地板上。这是灯光直接照到的部分。

第 2 次:间接光登场

地板不是黑的,它把一部分光弹向右墙。右墙因此亮了——这就是间接光的第一次反弹。

第 3 次之后

右墙再弹向天花板。能量越弹越少,但房间整体被"抬"亮了一层。

全局光照就是这一部分

没有它,阴影里会死黑一片。难点在于:要算第 2 次,得先知道地板有多亮;要算第 3 次,又得先知道右墙有多亮——一环套一环。后面《把渲染方程拆成一次次反弹》那一页会把这个级数写成公式。

0.2

六个比喻,后面会一直用到

后面的内容会越来越抽象。进入公式之前,先准备六个比喻。现在不用全懂,读到对应的地方时,它们能帮你把机制挂在一个熟悉的画面上。

音响的均衡器,对应球谐函数。几个频段的旋钮就能大致还原一段音乐,光照在球面上的分布也能这样拆成几个"频段"。漫反射本来就没有"高音",所以只需要低频的几个旋钮。后面"9 个系数就够"的结论,就是从这里来的。

民意调查,对应噪点。问一百个人会有误差,想让误差减半,得问四百个人。用随机光线估计亮度也服从同一条规律。实时渲染的光线永远不够多,所以噪点是这类方法的本性,不是 bug。

冰箱门上的便签,对应 Surface Cache。常做的菜抄在便签上贴在冰箱门,就不用每次翻菜谱。Lumen 把算过的表面光照记在"便签"上,光线撞到表面时直接读,不在现场重算。这是整篇最核心的一招。

夜里走路的测距仪,对应距离场。手里的仪器告诉你最近的墙在三米外,你就敢闭着眼走三米。到了新位置再测一次。离墙越近,步子自然越小,所以永远撞不上。

长曝光摄影,对应时间累积。快门开久一点,画面里的噪点就没了,但走动的人会变成一道虚影。Lumen 的间接光滞后、Lumen Lite 的黑块拖尾,付的都是这笔代价。

隔着墙问信息亭,对应探针遮挡。信息亭就在十米外,但中间隔着一堵墙,它给的答案就不适用于你这一侧。判断"中间有没有墙",是所有探针方案里最要命的一步。

比喻只为建立直觉,严格的机制在对应的页里展开

音响的均衡器

对应:球谐 SH

几个频段的旋钮就能大致还原一段音乐。光照在球面上的分布也一样。而且漫反射本来就"没有高音",所以低频那几个旋钮就够——这就是 9 个系数的来历。

民意调查

对应:噪点从哪来

问 100 个人有误差,想让误差减半得问 400 个。光线也是这条规律。所以实时渲染的采样永远不够,噪点是本质,不是 bug。

冰箱门上的便签

对应:Surface Cache

常做的菜抄在便签上,不用每次翻菜谱。Lumen 把算过的表面光照记在便签上,光线撞上去直接读。这是全篇最核心的一招。

夜里走路的测距仪

对应:距离场 SDF

手里的仪器告诉你"最近的墙在 3 米外",你就敢闭着眼走 3 米。离墙越近,步子自动越小,所以永远撞不上。

长曝光摄影

对应:时间累积

多帧叠在一起能压掉噪点,但画面里动的东西会拖出影子。Lumen 的间接光滞后、Lumen Lite 的黑块拖尾,都是这笔代价。

隔着墙问信息亭

对应:探针遮挡

亭子就在十米外,但中间隔着一堵墙,它给的答案就不能用。判断"中间有没有墙",是所有探针方案最要命的一步。

这六个比喻会在后面各自对应到具体的页。现在不用全懂,有个印象就行,到那一页会再提一次。

0.3

十五个会反复出现的词

这张表是查阅用的,不必一次记住。遇到不认识的词,可以从目录跳回这里。

其中最重要的是一组区分:辐射亮度和辐照度。前者带方向,后者不带。后面会看到,漫反射只需要后者,正是这个结论让探针方案成为可能。

全局光照 GI
光弹过几次之后照亮的那部分画面
直接光 / 间接光
光源直接照到的 / 从别的表面弹过来的
辐射亮度 L
朝某个方向看过去有多亮,带方向
辐照度 E
这一点总共收到多少光,不分方向
反照率 ρ
表面把多少光弹回去。白墙高,沥青低
探针 Probe
空间里的一个采光点,附近的像素都来查它
辐射度缓存
存放已经算过的光,避免重算
距离场 SDF
每一点都记着离最近的表面还有多远
体素 Voxel
把空间切成小方块,像三维的像素
Clipmap
跟着相机走的多层网格,近处细、远处粗
球谐 SH
用几个数概括球面上的分布,像均衡器
八面体映射
把一个球面摊平成正方形纹理的办法
重要性采样
把有限的光线用在更可能有贡献的方向
时间累积
把前几帧的结果混进来,等于多了样本
历史失效
画面里新露出来的地方,没有历史可借

这里给的是便于理解的说法,严格定义在后面各自的小节里。

这里给的是便于理解的说法,严格定义见后面各页

全局光照 GI

光弹过几次之后照亮的那部分画面

直接光 / 间接光

灯直接照到的 / 从别的表面弹过来的

辐射亮度 L

"朝某个方向看过去有多亮",带方向

辐照度 E

"这一点总共收到多少光",不分方向

反照率 ρ

表面把多少光弹回去。白墙高,沥青低

探针 Probe

空间里的一个采光点,附近像素都来查它

辐射度缓存

存"已经算过的光"的地方,避免重算

距离场 SDF

每一点都记着"离最近的表面还有多远"

体素 Voxel

把空间切成小方块,像三维的像素

Clipmap

跟着相机的多层网格,近处细、远处粗

球谐 SH

用几个数概括球面上的分布,像均衡器

八面体映射

把一个球面摊平成正方形纹理的办法

重要性采样

把有限的光线用在更可能有贡献的方向

时间累积

把前几帧的结果混进来,等于多了样本

历史失效

画面里新露出来的地方,没有历史可借

加粗的那几个是全篇的主角:辐照度、探针、缓存、时间累积。认住它们,后面一大半内容就是它们的组合。

这张表是查阅用的,不必一次记住。遇到不认识的词可以翻回来。

0.4

怎么读这份讲解

全篇十一章加四个附录,共 115 节,按顺序分成 8 个页签,就是页面顶部那一排。每个页签是一次可以坐下来读完的量,读完一个再进下一个。

完整课程8 个页签,按顺序

一次一个页签,按顺序来。推导不要跳,后面的工程取舍全靠它们来解释。

程序向页签 1、3、4、5、7

渲染方程和噪声,DDGI,Lumen 的缓存、追踪和最终收集,最后是附录里的代码地图和 Pass 调度。页签 2 的球谐推导可以按需回看。

美术与技术美术页签 1、4、6

开场的白盒、Surface Cache 和薄墙漏光、调参与排错。公式可以用右上角的"公式"按钮收起。

想自己实现页签 1、4、5、7、8

先读懂缓存、追踪和收集,再看 Pass 调度,最后跟着附录 C 的八个里程碑动手,每一步都有完成标准和坑。

决策向页签 6、7

第 9 章的档位与排错、第 10 章 Lumen Lite 与移动端,再配合附录里的系统流图、Pass 开关和预算速查。

每个页签开头有一张卡片,列出它包含的章节和预计时间;读到页签末尾,按钮会带你进入下一个页签。页签会记住你在里面读到哪里,切回来时接着读。也可以按数字键 1–8 直接切换,或者把地址栏里带 #t3 这样后缀的链接发给别人,对方会直接打开那个页签。

右上角的演示按钮会把同一份内容切换成一页一屏的幻灯片,用 ← → 翻页,按 N 显示讲稿,适合讲给别人听。阅读时按 T 打开目录,目录可以跨页签跳转。

每一节末尾标了出处。证据分三档:官方文档与版本说明,可以直接引用;2022 年 SIGGRAPH 演讲里的数字,结构可靠,但具体数值可能已经变了;社区报告和本文的推断,对外讲之前请自己验证。附录的最后一节列了完整的参考资料。

路线划分是建议,按听众调整

完整课程

8 个页签,一次读一个,按顺序来。

程序向

页签 1、3、4、5、7:渲染方程 → DDGI → 缓存与追踪 → 最终收集 → Pass 调度。

美术 · 技术美术

页签 1、4、6:白盒、Surface Cache 与漏光、调参排错。

想自己实现

页签 1、4、5、7、8:原理 → 调度 → 八个里程碑动手。

决策向

页签 6、7:档位、Lumen Lite、移动端、系统流图与 Pass 开关。

页签会记住读到哪里

数字键 1–8 切换页签;地址后缀 #t3 可以直接分享某个页签。

00

这份讲解怎么走

全篇十一章加四个附录,分成八个页签。开场先让你看见间接光;第 1 章打数学的底;第 2、3 章走一遍五条算法路线,预计算一章、实时路线一章;第 4 到 8 章按管线顺序拆开 Lumen;第 9 章落到调参和内容规范;第 10 章讲 UE 5.8 的 Lumen Lite 和移动端;第 11 章收尾。附录 A 把所有部件拼回系统流图和代码地图;附录 B 讲引擎里的 Pass 必要与否、怎样调度,最后是参考资料;附录 C 带你按八个里程碑自己写一个 Lumen,并列出一路上的坑;附录 D 讲程序和美术怎样分层控制它、怎样按区域调。

00 · 开场

间接光是什么 · 六个比喻 · 术语

01 · 数学基础

蒙特卡洛 · L 与 E · 反弹级数

02 · 谱系(上):预计算

光照贴图 · 球谐 · PRT 推导与存储账

03 · 谱系(下):实时路线

体素 · 屏幕空间 · DDGI 推导 · 光追

04 · 思想与管线

三层缓存 · 三个 Pass · 一帧的读写

05 · 场景表示

卡片 · 图集 · 打光 · 多次反弹

06 · 追踪

HZB · 距离场 · Clipmap · 剔除

07 · 最终收集

探针 · 重要性采样 · 降噪 · 世界缓存

08 · 反射与硬件光追

分流 · 光线压缩 · Far Field · 实测

09 · 调参与落地

旋钮 · 档位 · 调试视图 · 清单

10 · Lumen Lite

换了哪四块 · 代价 · 评估顺序

11 · 收尾

常见误解 · 总结

A · 工程全景

路线图 · 系统流图 · 预算速查 · 参考资料

01

数学基础

全局光照难,不是因为光线追踪慢,而是因为渲染方程是一个自己引用自己的积分。

4 节

开场那个房间里,地板弹亮了墙,墙又弹亮了天花板。看起来只是多弹几次,但真要让计算机来算,马上会撞上两堵墙。

第一堵是数量:每个像素都要知道半球上所有方向射来多少光,而方向有无穷多个。第二堵是递归:要知道墙有多亮,得先知道地板有多亮,而地板的亮度又取决于墙。这一章用四节把这两堵墙讲清楚。后面所有的算法,不管是二十年前的 PRT 还是今天的 Lumen,都是在想办法绕开它们。

1.1

为什么实时全局光照这么难

先把问题摆清楚。离线渲染器算一帧可以花几分钟,游戏只有十几毫秒。在这十几毫秒里,全局光照有三件事很难做到。

第一,光线数量巨大。每个像素都想知道半球上各个方向射来多少光,而每个方向都要派一条光线去看。

第二,光线打中之后还要算光。光线撞到一个表面,得先求出那里的材质,再求那一点自己收到了多少光,而后者本身又是一个全局光照问题。很多人以为光线追踪贵在"追",其实相当一部分成本花在命中之后。

第三,结果不能提前烘焙。把光照预先算好存进贴图,在静态场景里效果极好;但光源一动、门一开、物体一挪,贴图就作废了。

Lumen 对这三件事的总体回答是:把算过的光照缓存起来,反复复用。

这句话现在还很抽象。这一章剩下的三节先把数学基础打好:间接光为什么是一个积分、为什么一算就有噪点;积分里出现的两个量到底是什么;以及这个积分为什么会"自己引用自己"。

光线数量巨大

每个像素都要追踪大量光线,才能收集各个方向的间接光

命中点要算光

光线打到表面后,还要先求材质,再求这一点的入射光

无法预先烘焙

光源、物体和材质随时变化,光照贴图会立刻失效

Lumen 的答案:把算过的光照缓存起来,反复复用。

1.2算法科普

蒙特卡洛积分:为什么会有噪声

先说清楚"间接光"在算什么。站在地板上的一个点抬头看,是一整个半球:天花板、墙、盒子、灯。这一点有多亮,取决于半球里每个方向射过来多少光,全部加起来。

把半球里每个方向来的光加起来。正对着表面的方向算足分,斜着来的打折扣;最后乘上表面自己的颜色。

L = ∫Ω Lin(ω) · cos θ · ρ/π dω

∫Ω … dω
把半球里的每个方向都加一遍
Lin(ω)
从方向 ω 射来的光
cos θ
斜射打折,越斜贡献越小
ρ
表面颜色(反照率)

方向有无穷多个,计算机没法一个个加。实时渲染的办法叫蒙特卡洛,说白了就是抽样调查:随机挑几个方向,各派一条光线去看,把看到的结果平均一下,当作答案。

随机挑 N 个方向去看,把结果平均。如果某个方向被挑中的机会比别的大,它的结果要打个折,免得被重复计算。

L ≈ (1/N) Σi f(ωi) / p(ωi)

N
派出去的光线条数
f(ωi)
第 i 条光线带回来的结果
p(ωi)
这个方向被挑中的机会
Σ
全部加起来

抽样就会有误差,误差在画面上就是噪点:每个像素随机挑的方向不同,有的碰巧多看到了灯,有的碰巧没看到,相邻像素于是明暗不一。下面这个白盒每一帧只给每个像素几条光线,而且不做任何叠加,你看到的就是原始的噪点:

白盒每一帧都是全新的随机光线。先拖"每帧每像素光线",再点"开始累积",看噪点怎么随光线数变少。

拖动光线数时会发现一件反直觉的事:从 1 条加到 16 条,花了 16 倍的力气,噪点却只少到原来的四分之一左右。这是抽样的铁律:

想让噪点减半,光线要变成四倍。

误差 ∝ 1 / √N

√N
光线条数的平方根
∝
"跟着……成比例变化"

这就是开场那个"民意调查":问一百个人有误差,想让误差减半,得问四百个人。离线渲染器每个像素可以追几千条光线,游戏一帧只有十几毫秒,每个像素只给得起个位数。

实时渲染不可能靠堆光线解决噪点,只能想办法让每条光线更值钱。

Lumen 用了三招:重要性采样让光线朝更有用的方向去;探针让一条光线服务一片像素;滤波和时间累积把邻居和过去几帧的光线也借来用。白盒里的"开始累积"就是第三招:每一帧的结果叠在一起,噪点很快消失。这三招在第 7 章依次展开。

在 UE 里你见过它切到 Path Tracer 视口模式,画面一开始满是噪点,停住不动之后越来越干净。这是同一件事:它在不停地多追光线,把结果平均。

漫反射间接光 = 对半球入射方向的积分

L = ∫ Lin(ω)·cosθ·ρ/π dω

蒙特卡洛:用 N 条随机光线估计它

L ≈ (1/N) · Σ f(ωi) / p(ωi)

f 是单条光线的贡献,p 是选中这个方向的概率;除以 p,换一种采样方式结果也不偏。

光线数 N 与噪声

N=1

N=4

N=16

N=64

光线数 ×4,噪声只减半(∝ 1/√N)

重要性采样

让每条光线更有用

探针共享

一条光线服务多个像素

滤波与时间累积

把邻居和历史当作额外光线

1.3

辐射亮度 L 与辐照度 E:GI 到底在求什么

上一节的公式里藏着两个量。它们的区别是读懂后面所有算法的钥匙:后面每一种方法的差别,归根结底都是一个问题,存 L,还是存 E。别被字母吓到,它们都是日常就能理解的东西。

青色虚线是法线 n。每条橙线是一个入射方向 ω,它带来一份辐射亮度 L(ω)。

图 1.3表面上一点的上半球。青色虚线是法线 n(表面的正前方),每条橙线是一个入射方向 ω,各自带来一份辐射亮度 L(ω)。

辐射亮度 L(radiance)是"朝某个方向看过去有多亮"。用相机对着一面墙拍,照片上每个像素记录的,就是从那个方向射进镜头的 L。它带方向:同一个点,从不同角度看可能不一样亮,比如镜子。

它有一个关键的性质:沿着光线走,L 不会变。正因为如此,"派一条光线出去,看它撞到的地方有多亮"才说得通,这是整个光线追踪成立的前提。

辐照度 E(irradiance)是"这一点总共收到多少光",不分方向。在地板上放一个测光表,读出来的就是 E。

E 就是把头顶半球里每个方向的 L 收集起来:正对着表面来的光算足分,斜着来的打折,贴着表面擦过的几乎不算。

E(x) = ∫ L(x, ω) · (n · ω) dω

x
表面上的那一点
ω
某一个方向
n · ω
表面正前方和这个方向的夹角有多小,就是"斜射打折"
dω
一小块方向,像把天空切成小格

为什么斜着来的要打折?拿手电筒照桌面就明白了:正对着照,光圈小而亮;斜着照,同样多的光摊成一个长椭圆,每一小块分到的就少了。

漫反射表面,比如白墙、粗糙的地面,有一个很省事的性质:它朝各个方向反射得一样亮。所以它看起来有多亮,只取决于它收到了多少光,也就是 E:

漫反射表面看起来的亮度 = 它收到的光 × 它自己的颜色 ÷ π。除以 π 只是为了保证反射出去的光不会比收到的还多。

Lo = (ρ / π) · E

Lo
这一点看起来有多亮
ρ
表面颜色,也就是反照率
π
3.14,保证能量不会凭空变多

漫反射只需要 E 这一个数,不需要知道光从哪个方向来。

这一行是后面"探针只存辐照度"的全部理由,DDGI 和 Lumen Lite 都建立在它上面。镜子和光滑的金属就不一样了:它们映出的是某个特定方向的景物,必须知道光从哪个方向来,一个 E 不够用。漫反射和反射在 Lumen 里要分两条路走,根源就在这里。

在 UE 里你见过它Directional Light 的强度单位是 lux,衡量的是"地面收到多少光",这是一种 E。Sky Light 抓下来的那张立方体贴图,每个像素记录一个方向射来的光,那是 L。

本页为标准辐射度量学定义 · 图为二维示意

立体角 ω · 单位 sr

方向的"面积"。整个球是 4π,上半球是 2π。积分符号下的 dω 就是在扫过这些方向。

辐射亮度 L · radiance

单位面积、单位立体角上的功率。它沿光线传播不变,所以"追一条光线、取回一个 L"才成立。这是整个光追的前提。

辐照度 E · irradiance

E(x) = ∫ L(x, ω) · (n·ω) dω

这一点从整个上半球收到的总量。它是一个数(每色彩通道一个),不再带方向。

漫反射的出射

L_o = (ρ / π) · E

ρ 是反照率。π 的来历就是 ∫(n·ω)dω = π,用来做归一化,保证能量不放大。

结论:漫反射只需要 E 这一个数,不需要完整的 L(ω)。整个"探针存辐照度"的做法,理由就在这一行。

反过来,光滑反射需要知道"从哪个方向来的",E 不够用,必须保留 L(ω)。这就是后面漫反射和反射要分两条路走的根源。

1.4

把渲染方程拆成一次次反弹

现在可以回答开场那个房间留下的问题了:为什么"要算墙得先算地板"会让问题这么难。

把上一节的思路写完整,就是图形学里最有名的一个式子,渲染方程:

一个点看起来有多亮 = 它自己发的光 + 它从四面八方收到、再按材质反射出去的光。

Lo(x, ωo) = Le + ∫ fr · Li(x, ωi) · (n · ωi) dωi

Lo
这一点朝相机看起来有多亮
Le
它自己发的光:灯才有,墙是 0
fr
材质,光照上来以后怎么反射(BRDF)
Li
从某个方向射进来的光

难点藏在 Li 里。从某个方向射进这一点的光是哪来的?是从那个方向看过去,撞到的那一点反射出来的光:

我收到的光,就是别人看起来有多亮。而别人有多亮,又要用同一个式子去算。

Li(x, ωi) = Lo(y, −ωi)

y
从 x 朝 ωi 看过去撞到的那一点
−ωi
反过来的方向:从 y 射向 x

所以等号两边都有我们要求的那个"亮度"。这就像两面相对的镜子:你在一面里看到另一面,另一面里又看到这一面,一层套一层。这是一个自己引用自己的方程,没法直接算出来。

换个写法会清楚很多。把"收集四面八方的光、按材质反射出去"这一整套动作起个名字,叫 T,意思是"让光再弹一次":

画面 = 光源本身 + 把整个画面再弹一次。

L = Le + T L

T
"让光再弹一次"这个动作

把右边的 L 换成整个右边,反复代入,就展开成一串加法:

最终画面 = 光源 + 弹一次的光 + 弹两次的光 + 弹三次的光 + ……一直加下去。

L = Le + T Le + T² Le + T³ Le + …

T² Le
灯光弹了两次之后的那部分

这串加法的每一项都有具体的样子:第零项是直接看见的灯,第一项是直接光照,第二项是第一次反弹的间接光。开场白盒里的"反弹次数",拖的就是这串加法加到第几项。下面这个白盒多了一个"墙面反照率",可以试试它对这串加法的影响:

白盒把反照率拉高,再把反弹次数从 1 拖到 4。切到"只看间接光"更明显。

每一项比上一项小多少,取决于表面能把多少光弹回去,也就是反照率。深色的室外场景反照率大约 0.2,每一项依次是 100%、20%、4%,弹两次基本就到头了。白墙的室内大约 0.8,依次是 100%、80%、64%,弹到第三次还剩六成以上。

白墙的房间要攒很多次反弹才算得准。这就是 Epic 把"室内干净的光照"列为更难目标的原因。

这串加法后面会通向两条路。Lumen 的 Surface Cache 每更新一轮就多攒一次反弹,本质上是在一项一项地往上加。PRT 的想法更大胆:如果房间里什么都不动,T 能不能整个提前算好?下一章就从这里出发。

标准推导 · 柱状图为按 ρ 的幂次估算的示意,不是实测

① 渲染方程

L_o(x,ω_o) = L_e + ∫ f_r · L_i(x,ω_i) · (n·ω_i) dω_i

L_e 是自发光,f_r 是 BRDF。看着像个普通积分。

② 递归藏在这里

L_i(x,ω_i) = L_o(y, −ω_i)

y 是沿 ω_i 看过去命中的那个点。所以等号两边都有未知的 L —— 这是一个积分方程,不是一道积分题。

③ 写成算子

L = L_e + T·L

把那个积分整体记作传输算子 T,意思是"再弹一次"。方程瞬间变清爽。

④ 展开成级数

L = L_e + T·L_e + T²·L_e + T³·L_e + …

像 1/(1−x) 的展开。第 n 项,就是恰好弹了 n 次的光。

每一项的衰减取决于反照率 ρ

深色室外 ρ≈0.2

100%

20%

4%

弹两次基本就到头了

白墙室内 ρ≈0.8

100%

80%

64%

弹三次还有六成,所以室内更难

这个级数解释了两件事

为什么"室内干净光照"被 Epic 列为更难的目标:白墙反照率高,级数衰减慢,要攒更多项才收敛。

往下通向两条路

Lumen 的"每轮更新多一次反弹",就是在逐项累加这个级数。
而 PRT 的做法更大胆:几何固定的话,T 的作用能不能整个预先算出来?

1 / 1