篇目 37 · 讲座精读

$99 手机也要跑得动任意多盏动态灯:把光源采样从逐像素搬到逐 tile,用两级蓄水池把成本钉住

HypeHype STB · 一部 $99 的手机要跑任意多盏动态灯:带宽只有约 15 GB/s(约等于二十年前的 Xbox360 与 PS3),还被被动散热逼着少搬字节;另一头是面向休闲创作者的平台,灯会被随机生成、也可能被一次塞满一间屋子。讲者的解法是把光源采样的单位从像素搬到 tile —— 一块 tile 只存一组共享样本,访存、带宽与 wave 发散一起降;两级精度不同的 PDF 接力,第一级用一条「中心线段」上的全向光标量照度做粗略 PDF 把候选缩到 16 盏,第二级换成带可见性与 BRDF 的随机求值;样本在画面上先用交错采样破小 tile 的采样相关性、再用随机双线性抹掉 big-tile 的方块;阴影被拆出去单独跑一趟,每 2×2 像素求一次。代价写在明面上:1spp 随机照明在 Adreno 610 上只增 0.66 毫秒(只含直接光),而去噪仍未定案

讲者 Jarkko Lempiäinen(HypeHype)· 26 张原样引用(源 slide 4–57) 出处 SIGGRAPH 2025 Advances in Real-Time Rendering in Games course · 2025-08 许可:非 CC(讲义页脚只有课程名;slide 8 的 Sponza 另属第三方)· 逐件登记、逐图署名 · 未修改 · 存在许可残留风险 精读执笔 · 浅墨
14 章一级章节(按拆解点切)
0 式讲义未给公式,本稿不补推导
26 张配图(原文 26 / 自绘 0)
8 条边界与反例(独立成节)

图-段配对表 · 本稿 26 张

图角色档归属支撑的论断层次状态
图 1-1E§1手机端五道约束:带宽、散热、TBR/FBC、像素着色器、fp16①②④讲义 slide 4 · 原样引用
图 2-1E§2用户端不可预测性:光源随机聚集、创作者手工摆灯①②④讲义 slide 7 · 原样引用
图 2-2E§2Tiled Deferred:访存一致是好处,三条代价(含第三方模型署名)①②④讲义 slide 8 · 原样引用
图 3-1E§3ReSTIR 的页内清单:固定成本换噪声,访存与发散是代价①②③讲义 slide 9 · 原样引用
图 3-2E§3方案总纲四条:降带宽与发散、像素着色器、高质量 PDF、两阶段 SRS①②③讲义 slide 12 · 原样引用
图 4-1E§4五阶段流程:CPU 剔除 → Big-Tile → Small-Tile → 延后阴影 → 照明①②③讲义 slide 13 · 原样引用
图 4-2E§4Big-Tile 布局:128×128 像素、每块 16 盏、SRS 不放回①②③讲义 slide 15 · 原样引用
图 5-1E§5样本存储:32 位(索引 + 权重)、4×4 像素写回、1080p 的 60×36①②③讲义 slide 16 · 原样引用
图 5-2E§5Big-Tile PDF:MinMax 深度 LOD6 → 中心线段 → 最近点标量照度①②③讲义 slide 17 · 原样引用
图 6-1E§616 条流与 A-Chao WRS:起点同索引、按 16 取模错开、种子对齐①②③讲义 slide 18 · 原样引用
图 6-2E§6同样本数下的噪声对照:均匀采样对 big-tile 蓄水池重采样①②④讲义 slide 20 · 原样引用
图 7-1E§7Small-Tile 布局:256 像素、1 到 4 盏,规则网格出 tiling 伪影①②③讲义 slide 22 · 原样引用
图 7-2E§7交错采样:4 个相邻 tile、32×32 footprint、64 个 quad、高斯–泊松①②③讲义 slide 23 · 原样引用
图 7-3E§7随机双线性:随机偏移中心点,big-tile 方块伪影消失①②③讲义 slide 25 · 原样引用
图 8-1E§8Small-Tile PDF:64 取 4 个样本点、视见效率加权、假定单色①②③讲义 slide 26 · 原样引用
图 8-2E§8PDF 偏差:无法处处非零 → 带偏向的照明边缘噪声①②④讲义 slide 28 · 原样引用
图 9-1E§9Small-Tile 蓄水池:沿用 SRS 策略拆成 N 条流,成本与 N 无关①②③讲义 slide 29 · 原样引用
图 10-1E§10延后阴影 pass:按 quad 求值、8×8 像素块存放、8 位加 1 位噪声①②③讲义 slide 32 · 原样引用
图 10-2E§10阴影图集更新:临时深度缓冲拷入、静态图与动态图分治①②③讲义 slide 35 · 原样引用
图 10-3E§10阴影滤波:硬件 PCF 配随机 PCF,同时应用 IES 光型与角度衰减①②③讲义 slide 37 · 原样引用
图 11-1E§11照明求值:16×16 反查表映射 + 逐个样本累加 Lambert + GGX①②③讲义 slide 40 · 原样引用
图 11-2E§11去噪(进行中):TAA 兼任去噪器,历史颜色截断与噪声冲突①②④讲义 slide 43 · 原样引用
图 11-3E§11画面:1spp 与 4spp 的对照①②④讲义 slide 45 · 原样引用
图 12-1E§12测试硬件:Adreno 610($99 机、3W)、Adreno 830($1000 机、5W)、RTX 4070①②④讲义 slide 53 · 原样引用
图 12-2E§12直接光成本:1spp 在三台设备上的增幅(只含直接光)①②④讲义 slide 55 · 原样引用
图 12-3E§12随 spp 的伸缩:50 盏相机视锥内局部光源的场景①②④讲义 slide 57 · 原样引用
角色档按 20 号票的裁决:E 类(承载可核对数值或作为唯一证据)禁止自绘,故本篇 26 件证据全部引用讲义原页(整页渲染·仅幻灯片区,1600×900);本篇 S 类图为 0,S 类配额为 0,自绘 0 张。
许可:讲义逐页检索只在 slide 8 命中一次 ©,内容是 Sponza 模型的第三方素材署名(© 2010 Frank Meinl, Crytek,经 Morgan McGuire 图形档案下载),不是本讲义的整体许可;其余 63 页页脚只有课程名 Advances in Real-Time Rendering in Games course,未检到 Creative Commons / CC BY / MIT / License 任何声明,亦未检到代码仓库或开源链接 → 按分区非 CC 口径处理:逐件登记、逐图署名(图号 + slide 号 + 出处 + 「未修改引用」),并标注残留风险(讲义未授权转载,条款以官方发布为准),不得写成 CC 或可自由转载。slide 63 的 Fast GLSL PRNG 代码是讲义自带片段,不是可引用的开源许可。
开篇要接住的那个问题 讲者开篇(英文原样引用 · 讲义 slide 0、slide 1)

"Hello everyone, and welcome to the presentation about Stochastic Tile-Based lighting! I'm Jarkko Lempiäinen and I work as a Principal Graphics Engineer at HypeHype."

这一篇要讲清的八件事
  • 两端同时收紧:一头是 $99 手机只有约 15 GB/s 带宽与约 250 GFLOP/s 算力(约等于二十年前的 Xbox360 与 PS3,高端机也只到约 85 GB/s),被动散热让吃带宽的操作直接变成发热降频;另一头是休闲创作者不做性能调优,而灯会被敌人死亡随机生成、也可能被一次性塞满一间屋子(讲义 slide 4、6、7)。
  • 两条现成路各有各的账:Tiled Deferred 只随每块 tile 的灯数线性增长,简单场景里每 tile 灯数也会偏高,tile 剔除本身很贵(讲义 slide 8);ReSTIR 的固定成本很好,但它逐像素采样,均匀采样对场景光源是随机访问、吃带宽,还得再做一次时空重采样,而逐像素的光源类型差异又带来数据读取与代码发散(讲义 slide 9)。讲者的结论是没有找到既合用又是为低端移动端设计的方案。
  • 换掉的是采样的单位:不再逐像素采样,改逐 tile 采一组共享的光源样本,访存、带宽与 wave 发散都随之下降,一个 wave 里的线程走同一条执行路径;整套设计可以用像素着色器实现,为的是吃到移动端基于 tile 的渲染与帧缓冲压缩(讲义 slide 12)。
  • 两级 PDF 接力:为每块 tile、每盏灯精确算 PDF 太贵,于是分两级 —— Big-Tile(128×128 像素一块、每块蓄水池 16 盏互不重复的灯、用「不放回」的 SRS,讲义 slide 15)用一条由深度上下界构成的中心线段上的全向光标量照度做粗略 PDF(讲义 slide 17);Small-Tile(每块 256 像素、重采样 1 到 4 盏)换用带可见性与 BRDF 的高质量 PDF(讲义 slide 22、26)。
  • 样本怎么在画面上摆,是一等公民:规则 16×16 网格会产生肉眼可见的 tiling 伪影(讲义 slide 22);第一处修法是交错采样 —— 4 个相邻 tile 铺在 32×32 像素上、每块 64 个 2×2 像素 quad、按高斯–泊松分布(讲义 slide 23);交错之后方形 big-tile 伪影仍在(因为蓄水池是在 small-tile 中心点上被点采样的),第二处修法是随机双线性,靠随机偏移中心点把方块抹掉(讲义 slide 24–25)。
  • 代价与偏差都写在明面上:small-tile 的 PDF 做不到处处非零,4 个样本点可能全落在阴影里,由此产生带偏向的照明边缘噪声,在光照简单处最明显(讲义 slide 28);为性能放弃了在 RGB 乘积之后加权,因此材质与光源被假定为单色(讲义 slide 26);减少 big-tile 蓄水池会让画面整体变暗,是裁光权重压萤火虫留下的偏置(讲义 slide 47)。
  • 阴影被拆出去单独算:延后阴影 pass 与照明解耦,每 2×2 像素求一次(求值次数降到四分之一)、阴影项按 8×8 像素块存放、只存 8 位加 1 位时序噪声(1080p 下约 0.5 MB 起),换回更简单的照明着色器与可替换的阴影技术(讲义 slide 32–37)。
  • 去噪仍未定案:计划让 TAA 兼任去噪器以免多开一趟吃带宽的 pass,难点是标准 TAA 的 3×3 邻域历史颜色截断在噪声输入下会造成闪烁的照明光斑;讲者自陈这是当前最大的挑战,整套开发仍是进行中的工作(讲义 slide 43、59)。

1开场:一部 $99 手机要跑起来的光照

 开场:一部 $99 手机要跑起来的光照

讲者开场先报身份与题目,这一篇的题目是 Stochastic Tile-Based lighting(随机 tile 照明)。他叫 Jarkko Lempiäinen,在 HypeHype 任首席图形工程师(Principal Graphics Engineer)。过去二十五年他主要做 AAA 渲染技术,先后在 Ubisoft、Unity 与 Treyarch 工作,大约一年前加入 HypeHype。这个平台的运行范围很宽,从入门手机一直铺到高端 PC。目前平台上用户已经创作出约五十万个游戏,任何人都能玩,也能按自己的喜好改编。平台的目标是让创作游戏这件事对所有人都变得简单有趣,其中也包括完全没有技术背景的休闲用户(讲义 slide 1)。

这些背景往下压出一串技术口径:整套东西要在几乎没有技术门槛的前提下工作,同时保证画质与性能在所有设备上都成立;为了把门槛再压低一层,团队在做能直接跑在手机上的直观创作工具,也在把 AI 接进创作流程(讲义 slide 1)。

讲者交代了这套光照的来处。他加入 HypeHype 的时候,引擎原本只支持带阴影的太阳光。为了提升游戏的观感,他开始动手做一套局部光照方案。这一篇讲的就是他们为「连入门手机也要跑得动」而开发的那套随机光照算法(讲义 slide 2)。

要跑起来,先要过手机端的一串硬约束(讲义 slide 4)。第一道是带宽与算力,讲义给的是入门档的读数:今天的入门手机峰值带宽大约 15 GB/s,算力大约 250 GFLOP/s,这个量级大致等于二十年前发布的 Xbox360 与 PS3。就算是高端手机,峰值带宽也只到大约 85 GB/s。作为对照,Xbox Series X 与 PS5 Pro 的带宽都超过 500 GB/s,算力分别是大约 12 与大约 17 TFLOP/s。

第二道约束是被动散热。手机没有主动风扇,热量只能靠机身穿出去,于是吃带宽的操作会很快转成热量,芯片随后降频来控温。讲者给了一个换算:在 GPU 与 DRAM 之间搬动一个字节所消耗的功率,是一次简单 ALU 运算的上百倍。这条账解释了为什么后面所有设计都在拼命少搬字节(讲义 slide 4)。

第三道约束决定了整套实现的形状。移动端 GPU 主要依靠基于 tile 的渲染(tile-based rendering)来省带宽:画面先切成一块块 tile(区块),逐块渲染进片上一小块访问很快的内存,等一块 tile 的全部三角形都光栅化完,才把这块的渲染目标数据写回主存,写回时往往再走一道无损的帧缓冲压缩(frame buffer compression,FBC),把传输量进一步压低。这套分工要求算法尽量用像素着色器(pixel shader)实现,而不是计算着色器(compute shader);渲染的趟数也要压到最低,原因是每一趟都可能带来与主存之间的来回搬运(讲义 slide 4、5)。

第四道是数值格式。为了把算力用足,算法要从头按半精度浮点(fp16)来写,因为移动设备普遍配备了双速的 fp16 流水线。第五道是通用的 GPU 优化,讲义点名了两条:减少分支发散(divergence),以及控制向量通用寄存器(VGPR)的用量(讲义 slide 5)。

这五条彼此扣着。带宽与算力是硬上限,散热的账逼着人少搬字节、少开趟数,基于 tile 的渲染与帧缓冲压缩把实现方式限定在像素着色器上,半精度与发散、寄存器三条落到着色器内部的写法;后面每一个选择,几乎都能回溯到其中某一条。

Mobile Challenges 页
图 1-1 E 类·证据 · 讲义 slide 4 · 原样引用 怎么读 ①指认:这一页把移动端光照要过的坎分组列开,第一组是入门档手机的峰值带宽与算力,紧跟着给出与主机的对照;第二组是被动散热,写明吃带宽会发热并因此降频;第三组是基于 tile 的渲染与帧缓冲压缩,并点出由此必须用像素着色器而不能用计算着色器;第四组是着色器按半精度浮点来写。②读法(怎么读):把它当成全篇的约束页,后面每一个取舍都能回溯到这里的某一条;页内对照属于该页的原始口径,不往其它设备或场景上外推。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

本章可核对的结论有两条。讲者是 HypeHype 的首席图形工程师 Jarkko Lempiäinen,此前二十五年做 AAA 渲染,待过 Ubisoft、Unity 与 Treyarch,约一年前加入(讲义 slide 1)。平台是用户创作内容的平台,已有约五十万个用户创作的游戏,面向包括没有技术背景的休闲创作者,创作工具要跑在手机上并把 AI 接进流程(讲义 slide 1)。这套光照的起点是引擎原本只有带阴影的太阳光(讲义 slide 2)。它要过的手机端约束有这几条:入门机约 15 GB/s 带宽与约 250 GFLOP/s 算力、高端机也只到约 85 GB/s、搬一个字节的功耗是简单 ALU 的上百倍、基于 tile 的渲染与帧缓冲压缩要求用像素着色器并压低趟数、从头按 fp16 写并控制发散与寄存器用量(讲义 slide 4、5)。下一章转到用户那一侧。

2两条现成路都不合用

上一章把手机端的几道硬约束摆齐,这一章换到用户那一侧。那些约束会被具体的创作行为反复撞到,而这些行为又把新的要求压回光照算法身上。

平台面向的是休闲创作者,这一层用户在灯光上带来的麻烦,讲义列成三条(讲义 slide 6)。第一条,创作者不做性能调优。第二条,照明控制必须直观而且稳健,好让给场景打光这件事保持简单、好玩。第三条,画面与性能要在所有设备上一致。备注把来由补全:不能指望创作者理解性能取舍,也不能指望他们针对不同硬件各调一套参数;一致性一旦撑不住,就会变成破坏玩法的问题(讲义 slide 6)。

第二条压力来自不可预测。光源会被随机生成,也会被移动,讲义举的例子是画面里每一个粉色的球都是一盏灯,在敌人死亡的那一刻被创建出来。创作者还可能在兴致上往一间屋里塞进五十盏带阴影的灯。这两件事难防,与创作方式有关:创作者是用素材库里的预制件拼场景的,预制件本身就带着灯。讲者说,他们承担不起因为这种聚集而出现的大幅掉帧或视觉干扰(讲义 slide 7)。

UGC Challenges 页
图 2-1 E 类·证据 · 讲义 slide 7 · 原样引用 怎么读 ①指认:这一页在休闲创作者这一条下接着列出两条,一条是动态光源会不可预测地聚集,另一条是创作者会做出并不最优的手工摆灯;同页备注给了「每个粉色球都是敌人死亡时生成的一盏灯」这个例子,并说到创作者可能干脆把一整间屋子堆满带阴影的灯。②读法(怎么读):把它和上一页连起来读,上一页是用户端的三条要求,这一页是这些要求要拦住的两种具体情形;页内的摆灯是讲义举的例子,不当作实测场景。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

为了找路,他们先看了两条现成的方案。第一条是已经用在很多现代渲染器里的 Tiled Deferred 照明,也就是延迟照明(deferred lighting)的做法。它的好处讲义写成两条:局部访存,以及 wave(线程波)对齐的照明求值。代价有三条。它只随每块 tile 的灯数线性增长,而且默认美术会限制光源的影响范围。即便在相当简单的场景里,每块 tile 的灯数也会变得很高,讲者在这一页用 Sponza 模型标出了物体轮廓处的高灯数。tile 的光源剔除本身也很贵,精确到逐 tile 视锥检查时尤其贵。备注补了一处做法与后果:有些引擎会给每块 tile 的灯数设一个上限,超过就会出现闪烁的 tile 伪影。当动态光源加进来,照明成本会变得难以预测,在较弱设备上尤其容易变成性能问题(讲义 slide 8)。

Tiled Deferred 页
图 2-2 E 类·证据 · 讲义 slide 8 · 原样引用 怎么读 ①指认:这一页把 Tiled Deferred 照明排成好处与代价两栏,好处是访存一致与 wave 对齐的照明求值,代价是只随每块 tile 的灯数线性增长、简单场景里每块 tile 的灯数也会偏高、以及 tile 光源剔除本身很贵;页内用 Sponza 场景标出物体轮廓处的高灯数。②读法(怎么读):把它当成第一条路的账单页,其中「简单场景也偏高」这一条是后面转向随机采样的关键;页脚另有一处第三方模型署名,按原样保留。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用;页内使用 Sponza 模型,© 2010 Frank Meinl, Crytek,经 Morgan McGuire 图形档案下载

第二条现成路是 Bitterli 等人的 ReSTIR,属于随机采样(讲义 slide 9)。随机采样这条思路的长处是成本固定,与场景的光照复杂度无关,付出的代价是多出来的噪声。它的问题出在采样的粒度上:ReSTIR 逐像素采样。除了对场景光源做均匀采样,它还要从前一帧的局部像素邻域里重采样光源。均匀采样对场景光源是随机访问,对缓存很不友好,会把带宽用量抬上去;而均匀采样的结果又太噪,于是它得再从历史缓冲里做一次时空重采样,这又是一次吃带宽的操作。逐像素地做这种带宽密集的采样,在移动端就相当贵。逐像素采样还带来第二层麻烦:光源的数据与类型会逐像素随机变化,求值时出现不连贯的数据读取与发散的代码路径(讲义 slide 9)。

讲者的结论落在一句很平的话上:他们没有找到既符合自己需要、又是为低端移动端设计的现成方案(讲义 slide 9)。

本章可核对的结论有三条。用户端的要求是不做性能调优、照明控制直观且稳健、画面与性能在所有设备上一致(讲义 slide 6)。创作者的行为里有两处不确定,光源会被随机生成与移动,创作者也可能在一间屋里堆起大量带阴影的灯(讲义 slide 7)。两条现成路各有各的账(讲义 slide 8、9),讲者由此收在「没有找到相配的现成方案」这一句上。下一章看他们换掉的那个单位。

3把采样单位从像素换成 tile

这一章从上一章的结论处往前接。那个结论所依据的第二条现成路,页内清单留在图 3-1(讲义 slide 9),好处一栏只有一条,代价一栏有两条。看清这一页的账,才能明白他们为什么不再在像素这个粒度上做文章。

Existing Lighting Solutions(ReSTIR)页
图 3-1 E 类·证据 · 讲义 slide 9 · 原样引用 怎么读 ①指认:这一页在同一个标题下把 ReSTIR(Bitterli 等)排成好处与代价两栏,好处一栏写的是与场景复杂度无关的固定成本,并在括号里注明代价是多出来的噪声;代价一栏写的是访存不友好导致带宽用量上升,以及逐像素的数据与代码发散。②读法(怎么读):把它和上一章读完的 Tiled Deferred 页对读,两页用同一套版式,读的落点也都在「弱设备上撑不撑得住」;这页本身不含数值表。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

新方案的总纲在一页上列成四条(讲义 slide 12)。第一条是优化带宽、减少发散。第二条是可以完全用像素着色器实现,目的写在括号里,为了吃到移动端基于 tile 的渲染与帧缓冲压缩。第三条是用高质量的概率密度函数(PDF,probability density function)把噪声压下去。第四条是两阶段采样,两级都建立在分层蓄水池采样(Stratified Reservoir Sampling,SRS)上。这四条是并列的定位,说的是这套方案要同时满足的几件事,而不是先后步骤。

备注把「为什么把单位换成 tile」讲清楚了。采样按 tile 做而不按像素做,意味着一块 tile 只存一组共享的光源样本,这组样本被这块 tile 的全部像素共用。样本的单位一放大,访存、带宽与 wave(线程波)发散都跟着下降。与传统做法一样,一个 wave 里的线程会走同一条执行路径,访存也连贯。方案里的每一趟都是按像素着色器设计的,但讲者补了一句:若把其中某些趟改写成计算着色器,在某些硬件上还能更快,只是这套设计并不依赖它(讲义 slide 12)。

压噪声的想法也在这页。要让噪声与去噪成本都低,他们希望采样是被一个高质量的重要性函数引导的,也就是重要性采样(importance sampling)里那个用来分配样本的函数。讲者给了一个很具体的理想情形:若某块 tile 对某盏灯完全落在阴影里,这盏灯就不该被挑中来参与照明。要精确做这件事,本可以逐 tile、逐灯地把 PDF 算一遍,但整场算下来太贵,于是整套采样分成两级,用两种精度的 PDF 接力(讲义 slide 12)。

Tile-Based Solution 页
图 3-2 E 类·证据 · 讲义 slide 12 · 原样引用 怎么读 ①指认:这一页在「Tile-Based Solution」下列出四条,依次是优化带宽与减少发散、可以完全用像素着色器实现并在括号里注明是为吃到移动端的基于 tile 的渲染与帧缓冲压缩、用高质量 PDF 压噪声、两阶段采样并建立在 SRS 上。②读法(怎么读):把它当成全篇的总纲页,四条分别落在后面各章的某一段;四条之间是并列关系,页内没有画流程箭头,不要当成步骤顺序。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

两级采样与后面两趟连起来,是一条五阶段的链(讲义 slide 13)。最前面在 CPU 侧做相机视锥剔除,把场景里的光源筛一遍,剩下的光源列表交给 GPU。第一阶段是 Big-Tile Sampling,画面被切成一块块 big-tile(大区块),每块用一个简单、成本低的 PDF 跑一轮 SRS,这个 PDF 只是粗略近似光源对这块 tile 的重要性,采出的结果是光源的一个子集。第二阶段是 Small-Tile Resampling,从对应的 big-tile 蓄水池(reservoir)里再跑一轮 SRS,为 small-tile(小区块)重采样少量光源;这一轮换用质量更高的 PDF,把更准确的光源可见性与双向反射分布函数(BRDF)项算进去。第三阶段是延后阴影 pass,为 small-tile 的光源样本以及全部 tile 像素求阴影项,这一步刻意与照明着色器解耦,为的是优化性能。最后一阶段是照明 pass,逐像素读回光源样本与阴影项,求 BRDF,再按合适的权重把最终照明结果合成出来(讲义 slide 13)。

两级 PDF 的差别是这条链上的关键分工。第一级要在一整块大区域上很快把明显无关的灯筛掉,所以刻意做得便宜,只求方向大致对。第二级要在很小的区域上把真正影响画面的灯挑准,于是把可见性与材质项都放进来,代价是每次求值更贵。两者接力,噪声被压在前面的阶段,而不是全部推给最后的去噪。

本章可核对的结论有三条。方案是按 tile 而不按像素采样,一块 tile 只存一组共享的光源样本,访存、带宽与 wave 发散都随之下降,一个 wave 里的线程走同一条执行路径、访存连贯(讲义 slide 12)。总纲那一页把定位列成四条,两级采样都建立在 SRS 上,精确为每块 tile 与每盏灯算 PDF 太贵,这就是分两级的原因(讲义 slide 12)。整条链是五阶段,按顺序为 CPU 侧相机视锥剔除、Big-Tile Sampling、Small-Tile Resampling、延后阴影 pass、照明 pass,两级的 PDF 精度不同(讲义 slide 13)。下一章钻进第一级,看一块 big-tile 覆盖多大、每块放几盏灯,以及样本怎么写回一块很小的渲染目标。

4Big-Tile:一格 128×128 放 16 个光源

上一章把五阶段排完,最后停在第一级。这一页(图 4-1,讲义 slide 13)是那五阶段的页内版,本章回到它,从第一阶段往下钻一层。

五阶段流程页
图 4-1 E 类·证据 · 讲义 slide 13 · 原样引用 怎么读 ①指认:这一页是一整段连续文字,按顺序把五个阶段串成一条链,先写 CPU 侧的光源视锥剔除与它交出的光源列表,再写第一级按低成本 PDF 选子集、第二级按含可见性与 BRDF 的高质量 PDF 重采样,接着写与照明着色器解耦的延后阴影,最后写照明一趟如何逐像素读回样本与阴影项并合成结果。②读法(怎么读):把它当成全篇的路线图,第 4 到第 11 章分别对应其中一段;这页是纯文字页,页内没有配图,按段落顺序读即可。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

第一级的任务,是把场景里的所有灯缩到「这块区域大概相关的那些」。这一级要处理的是那份经过相机视锥剔除的光源清单,因此它必须便宜(讲义 slide 13、16)。布局上有两个量是定死的。一块 big-tile 覆盖 128×128 像素,讲义用棋盘格把这块范围标了出来。每块 big-tile 用一个蓄水池,里面放十六个互不相同的光源。备注交代了这一级的目的:先按 big-tile 采出一个光源子集,是为减少后面 small-tile 重采样要考虑的候选灯数,候选数降下来之后,第二级才有可能在很小的区域上把灯挑准(讲义 slide 15)。

为什么用 SRS,也写在这一页。它是「不放回」采样,因此蓄水池里不会出现重复的光源,蓄水池的空间也能用满。这两点对「维持一组多样又有代表性的光源」很重要,因为一块 tile 一共只有十六个位置,多放一盏重复的灯,就少一个位置,也少一个看角度。SRS 之所以适合写进像素着色器,在于每个蓄水池槽位都可以独立采样,槽位彼此之间不需要协商,也就不需要在槽位之间做同步。十六这个数字与蓄水池的空间直接相关,位置少,每一盏被选中的灯就更该是真的相关的那一盏(讲义 slide 15)。

Big-Tile Layout 页
图 4-2 E 类·证据 · 讲义 slide 15 · 原样引用 怎么读 ①指认:这一页列出 big-tile 的两条布局量,一块 tile 覆盖的像素范围与每块蓄水池存放的光源个数,并把采样算法写成 SRS,在其下注明两点:SRS 是「不放回」采样,因此蓄水池里不会有重复光源、空间也用得满;实现起来对像素着色器友好,因为每个蓄水池槽位可以独立采样。页内另用棋盘格示意 tile 的覆盖范围。②读法(怎么读):把这两条布局量当成后面所有存储与成本讨论的基数,第 5 章的 PDF、第 6 章的随机流都从它们出发;棋盘格是用来说明覆盖范围,不是场景内容。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

采出来的每一个光源样本,压进三十二位(讲义 slide 16)。在像素着色器的实现里,big-tile 采样着色器会为每一个蓄水池槽位各求一次,把这一份三十二位样本导出到渲染目标。这三十二位里装着两样东西。一样是光源索引,指向那份在 CPU 侧做过相机视锥剔除之后得到的光源缓冲。另一样是权重,取值是 PDF 的倒数。这三十二位内部怎么划分,讲义只给了一张格式示意图,没有写成文字,能确认的是它把索引与权重一起塞进一份样本,好让求值时一次读取就够。样本在渲染目标里按四乘四像素为一块写进去,粒度比像素粗,这样安排是为了让同一块缓存行能被更多相邻的求值复用,提高缓存一致性。讲者给了一个直观的规模:一帧 1080p 的画面,只需要一块六十乘三十六像素的小渲染目标来装这些蓄水池样本(讲义 slide 16)。

本章可核对的结论有三条。第一级的布局是一块 big-tile 覆盖 128×128 像素、每块蓄水池放十六个互不相同的光源,采样用 SRS;它是「不放回」采样,所以蓄水池里不会有重复光源,也把空间用满,而每个槽位可以独立采样,这就是它便于写进像素着色器的原因(讲义 slide 15)。存储上每个光源样本占三十二位,其中光源索引指向相机视锥剔除之后的光源缓冲、权重是 PDF 的倒数;样本按四乘四像素为一块写进渲染目标以提高缓存一致性,1080p 只需要一块六十乘三十六像素的小渲染目标(讲义 slide 16)。这一级的作用,是把候选灯数先缩下来,供后面的 small-tile 重采样取用(讲义 slide 15)。下一章看这一级的 PDF 怎么定,以及它在什么地方留了一个明确的假设。

5Big-Tile 的 PDF:一段「中心线段」

上一章把 big-tile 的布局、16 个槽位、不放回的采样方式与每个样本的存储格式都摆完了,这一章接着看样本里那个权重从哪里来。样本写进渲染目标时,权重取的是 PDF(probability density function,概率密度函数)的倒数(讲义 slide 16)。这个关系把第一级的成败压在了 PDF 上。PDF 越贴近光源对这块 tile 的真实影响力,蓄水池里挑出来的 16 盏灯就越有代表性;PDF 越粗糙,权重就越容易把照明预算花在用不上的灯上。第一级的问题因此只剩一个,用尽量少的代价换一个够用的 PDF。

Big-Tile 存储页
图 5-1 E 类·证据 · 讲义 slide 16 · 原样引用 怎么读 ①指认:这一页给出 big-tile 光源样本压进 32 位的格式图,并交代像素着色器实现下每个蓄水池槽位各自求一次、样本按 4×4 像素区域写进渲染目标、1080p 画面只要一张 60×36 像素的小渲染目标,光源索引指向相机视锥剔除后的光源缓冲。②读法(怎么读):把它当成第一级交到第二级手上的那张表,本章与下一章讲的就是这张表里的字段怎么被填出来,读的时候把索引与第 6 章的 16 条流连起来看。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

PDF 的构造在下一页分两步完成(讲义 slide 17)。第一步取深度范围,从 G-Buffer(几何缓冲)之后生成的层级 MinMax 深度缓冲(MinMax hierarchical depth buffer,最小最大值层级深度缓冲)里读出这块 tile 的深度上下界;128 像素的 big-tile 用的是这份缓冲的 LOD6,它的像素 footprint 与一块 big-tile 正好相同。第二步把上下界连成一条线,在 tile 的深度上下界之间构造一条中心线段,采样时对所有光源类型都套用同一个 PDF,做法是在这条线段上离光源最近的那个点处求一盏全向光(omni-light)的标量照度(scalar illuminance),拿它当作这盏灯对这块 tile 影响力的粗略估计。

这个 PDF 不引入采样偏置,理由在讲义里写得直白,PDF 处处为正(讲义 slide 17)。只要反射亮度可能非零的地方 PDF 都不为零,按它做的分层蓄水池采样(SRS)在期望上就不会把某些光源整块排除在外,第一级的 16 个候选因此保持无偏。

它的代价落在同一个假设上。讲义承认,这个 PDF 假设 tile 像素在深度上下界之间大致均匀分布,而这可能不成立(讲义 slide 17)。中心线段只用了上下界两个深度值,中间那段深度上究竟堆了多少像素,它没有过问。如果像素密集地聚在某一层,那个位置的光源本该拿到更高的权重,PDF 却按线段上的几何位置给它一个平平的估计。讲者的态度也在页内写明,用更准的 PDF 能提高蓄水池质量,但这个简单的 PDF 目前对他们够用。

Big-Tile PDF 页
图 5-2 E 类·证据 · 讲义 slide 17 · 原样引用 怎么读 ①指认:这一页用图示给出 tile 深度上下界的取法与那条标红的中心线段,页内要点写到对所有光源类型用同一个 PDF、在线段最近点处求全向光标量照度、PDF 处处为正故不引入偏置,末段承认它假设 tile 像素在深度界内大致均匀分布而这可能不成立。②读法(怎么读):把标红线段读成这个 PDF 的全部依据,它只用到上下界两个深度值,读的时候盯住「假设均匀」这四个字,本章末尾与第 8 章的偏差都从这里长出来。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

附录给这份 PDF 留了两条改进方向(讲义 slide 60)。第一条针对上面那个假设:如果深度范围很大,而 tile 像素大多贴近近/远平面,落在范围中段的光源就会被选得过频,噪声随之上升;更好的做法是按某个深度上的像素数给 PDF 加权。第二条是给聚光灯做的,当聚光灯锥(spotlight cone)不与 big-tile 的视锥相交时,把 PDF 置 0。附录里还有一句对整条第一级的评价,当前 big-tile 采样很高效,可以多花一些周期把样本质量提上去,以应付更宽的场景范围。

本章可核对的结论有四条。big-tile 样本里存的权重是 PDF 的倒数(讲义 slide 16)。PDF 的构造分两步,先从 G-Buffer 之后的层级 MinMax 深度缓冲取该 tile 的深度上下界,128 像素的 big-tile 用 LOD6、footprint 与 big-tile 相同,再在上下界之间构造中心线段,并在线段上的最近点处求全向光的标量照度(讲义 slide 17)。这个 PDF 处处为正,因此不引入采样偏置,代价是它假设 tile 像素在深度上下界之间大致均匀分布而这可能不成立(讲义 slide 17)。讲义 slide 60 的附录给了两条改进方向,按某个深度上的像素数给 PDF 加权,以及在聚光灯锥不与 big-tile 视锥相交时把 PDF 置 0。下一章看 16 个槽位怎么被真的填满 16 盏不同的灯。

6Big-Tile 的随机流与它的收益

上一章把 PDF 定成一条中心线段,这一章看它怎么落到 16 个槽位上。第一级的输出是每块 big-tile 蓄水池里 16 个互不重复的光源候选,难点在于要用像素着色器把这些槽位真的填满 16 盏不同的灯,而场景里的灯可能只有几盏,也可能有几百盏,两种情形都要稳住。

Big-Tile SRS 页
图 6-1 E 类·证据 · 讲义 slide 18 · 原样引用 怎么读 ①指认:这一页把 big-tile 的 SRS 做法逐条列出,光源拆成 16 条流、每条流跑 1-sample A-Chao WRS、流起点用同索引的场景光源、每轮按 16 取模做随机偏移、PRNG 用 big-tile 种子保证偏移序列一致,末行给出结果是 16 盏互不重复的重要性采样光源。②读法(怎么读):把这一页读成一条流水线,起点、偏移、打乱、收尾四步各解决一种毛病,读的时候对着备注看每步的目的,再看第 6 章末尾的噪声对照页验证收益。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

做法是把光源分成 16 条流,每条流对应一个 big-tile 蓄水池槽位,每条流跑一次 1-sample 的 A-Chao 加权蓄水池采样(Weighted Reservoir Sampling / WRS),16 条流各采一组唯一的光源,槽位之间因此不会出现重复的灯(讲义 slide 18)。流的起点取与蓄水池槽位同索引的那盏场景光源,这个初始顺序是为了把靠前的光源放进指定槽位,用来优化性能,并减少场景里只有少数几盏灯时的噪声。

之后每一轮迭代做三件事,向前跳到下一组 16 盏灯,为这一轮生成一个随机偏移,再用按 16 取模的方式错开各条流的索引,把流打乱(讲义 slide 18)。打乱有明确的目的,避免高权重光源在相邻 big-tile 与相邻帧之间反复争抢同一个槽位。这一步不改哪些灯被纳入,改的是同一批灯在各槽位与各块 tile 间的分布。这个过程一直重复,直到遍历完所有光源。

序列一致靠种子保证。像素着色器里每个槽位跑的是同一套循环,要让它们的随机偏移序列对齐,伪随机数生成器(PRNG)用 big-tile 的种子初始化(讲义 slide 18)。讲义把这段伪随机实现放在 slide 63 的附录里,这里只取它「用 big-tile 种子」这一点。

这一遍跑完,每块 big-tile 蓄水池里就是 16 个互不重复、无偏的光源候选,挑它们的依据是它们对该 big-tile footprint 的近似影响力(讲义 slide 19)。这一页还给了基于 A-Chao WRS 的槽位采样代码片段,按前面描述的随机偏移序列遍历场景光源,每一轮为每盏灯求一次 PDF,用 PDF 按概率挑灯,循环结束后把灯与它的权重写进蓄水池。

每轮迭代里为每盏灯求的那个 PDF,就是上一章那条中心线段上的估计值,写进蓄水池的权重取它的倒数(讲义 slide 18、19)。这条链把两章接了起来,PDF 的质量因此直接决定哪盏灯能留在槽位里。

这一级的收益可以直接从画面上看出来。对照页把两种取法并排放在一起(讲义 slide 20)。左边那张图里,small-tile 的样本是从 16 盏按均匀采样取出的场景光源里挑的;右边那张图里,样本是从装有 16 个样本的 big-tile 蓄水池里重采样出来的。

Big-Tile 噪声对照页
图 6-2 E 类·证据 · 讲义 slide 20 · 原样引用 怎么读 ①指认:这一页是两幅并排的对照图,左边从 16 盏按均匀采样取出的场景光源里挑 small-tile 样本,右边从 16 个样本的 big-tile 蓄水池里重采样。②读法(怎么读):把两幅图放在同样的样本数下比,差别只来自那 16 盏灯的来源,读的时候连着上一页的 16 条流看,理解第一级为什么要按 PDF 挑灯、均匀取为什么不够。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

同样的样本数下,右边的噪声明显更低(讲义 slide 20)。差别来自那 16 盏灯的来源。均匀采样把场景里所有灯一视同仁,某块区域真正受用的灯未必进得了那 16 个名额;big-tile 蓄水池按 PDF 挑灯,名额更可能落在对这块 footprint 影响大的灯上,第二级重采样时挑到有效光源的概率随之上升。备注没有给这组对照的场景与噪声度量,本章按性质转述,不替它量化。

本章可核对的结论有三条。第一级的采样把光源拆成 16 条流,每条流对应一个蓄水池槽位,各自跑 1-sample 的 A-Chao WRS,流起点与槽位同索引,之后每轮按 16 取模错开并生成随机偏移,直到遍历完所有光源(讲义 slide 18)。为保证像素着色器下各槽位的偏移序列一致,伪随机数生成器用 big-tile 的种子初始化(讲义 slide 18)。这样得到的每块蓄水池是 16 个互不重复、无偏的光源候选,按其对 big-tile footprint 的近似影响力挑出(讲义 slide 19),而同样本数下从 big-tile 蓄水池重采样比从均匀采样取噪声明显更低(讲义 slide 20)。下一章把单位从 big-tile 缩到 small-tile,看这些样本怎么摆到画面上。

7Small-Tile 的排布:从方块伪影到随机双线性

上一章结束时,场景里的灯已经被压缩到每块 big-tile 的 16 个候选。第二级的任务是在这 16 个候选里,为画面上更小的块挑出真正参与照明的少数几盏。这一章讲的是这批样本怎么在画面上摆,以及摆法改了两轮的过程。

第二级的重采样从 big-tile 蓄水池里为 small-tile 取 1 到 4 个光源,用的是同一套 SRS 来保证不重复(讲义 slide 22)。这一步的成本与场景的光照复杂度无关,因为重采样面对的是尺寸固定的 big-tile 蓄水池,池子多大与场景里有多少灯没有关系。每块 small-tile 覆盖 256 像素,重采样时按 small-tile 中心点的位置去挑一块 big-tile 蓄水池。

问题出在摆法上。如果 small-tile 的像素按规则的 16×16 网格摆放,采样点之间会产生相关性,画面上出现肉眼可见的 tiling(平铺)伪影(讲义 slide 22)。每块 small-tile 覆盖 256 像素,规则摆放正好是一个 16×16 的像素网格、一格一个采样点,这就是讲义所说的规则布局。规则网格的毛病在于每一块 small-tile 的采样点位置都一致,相邻 tile 的误差同相叠加,沿着十几像素的格子就显出方块状的纹路。

Small-Tile 布局页
图 7-1 E 类·证据 · 讲义 slide 22 · 原样引用 怎么读 ①指认:这一页列出 small-tile 布局的要点,从 big-tile 蓄水池重采样 1 到 4 个光源、用 SRS 保证不重复、每块 small-tile 覆盖 256 像素,并给出规则 16×16 像素布局下的 tiling 伪影图。②读法(怎么读):把它当成第二级的起点页,右下方那张伪影图是本章两处修法要解决的对象,读的时候记住伪影来自采样相关性,与光照本身无关。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

第一处修法是交错采样(interleaving)。把 small-tile 的像素与 4 个相邻 tile 交错,铺在更大的 32×32 像素 footprint 上;具体做法是为这 4 块 tile 分配 64 个 2×2 像素的 quad(2×2 像素组)样本,4 块 tile 的样本用不同的颜色区分(讲义 slide 23)。

样本的位置不随便撒。讲义用的是高斯–泊松分布(Gaussian-Poisson distribution),用意有两层,往 tile 中心略聚一些样本,同时避免把同一块 tile 的样本放在紧邻位置(讲义 slide 23)。这些采样图案随后在整幅画面上重复。交错之后,同一块 tile 的采样点不再挤在自己的 16×16 格子里,改为散布到相邻 tile 的范围里,相邻 tile 的采样相位因此被错开。

交错采样页
图 7-2 E 类·证据 · 讲义 slide 23 · 原样引用 怎么读 ①指认:这一页给出交错采样的做法,4 个相邻 tile 交错在 32×32 像素 footprint 上,每块 tile 64 个 2×2 像素 quad 样本,并用红绿蓝黄四色标出 4 块 tile 各自的预计算分布,说明用高斯–泊松分布让样本略靠 tile 中心又避免同 tile 样本相邻,图案在整幅画面上重复。②读法(怎么读):把四色分布图读成一个可平铺的小模板,它的作用是把相邻 tile 的采样相位错开,读的时候对着上一页的伪影看改动落在哪里。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

交错采样压掉了 small-tile 的 tiling 伪影,方形的 big-tile 伪影却还在(讲义 slide 24)。原因在讲义里给得很直接,big-tile 蓄水池是在 small-tile 的中心点上被点采样的,中心点落在哪块 big-tile 里,整块 small-tile 就只吃那一块蓄水池的样本,跨过 big-tile 边界时样本来源整块换掉,边界于是露出来。big-tile 的边长是 128 像素,这些方块伪影的尺度与它相称。

第二处修法把点采样换成滤波,在相邻 big-tile 之间做随机双线性(stochastic bilinear filtering)(讲义 slide 25)。实现方式是为重采样挑选 big-tile 时,随机偏移 small-tile 的中心点,不再每次取正中。讲义没有给出相邻两块 big-tile 之间的双线性权重公式,只交代了实现手段是随机偏移中心点,本章按这个口径转述。结果是 big-tile 之间的过渡变平滑,方块伪影消失。备注承认仍能看到一些交错的小 tile,但这幅画面已经更适合做时空去噪(spatiotemporal denoising)。

随机双线性页
图 7-3 E 类·证据 · 讲义 slide 25 · 原样引用 怎么读 ①指认:这一页给出第二处修法,用随机双线性在相邻 big-tile 之间取值,实现方式是随机偏移 small-tile 的采样中心,页内要点是方块伪影被消除、过渡变平滑。②读法(怎么读):把它与前面两页连读,能看到修法一处理采样相位、修法二处理 big-tile 边界这条分工,读的时候留意备注承认仍留有交错小 tile。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

本章可核对的结论有四条。第二级的重采样从 big-tile 蓄水池里为每块 small-tile 取 1 到 4 个光源,仍用 SRS 保证不重复,每块 small-tile 覆盖 256 像素,重采样按 small-tile 中心点位置挑蓄水池,而且这一步与场景的光照复杂度无关(讲义 slide 22)。规则 16×16 像素网格会因采样相关性产生肉眼可见的 tiling 伪影,第一处修法是交错采样,4 个相邻 tile 交错在 32×32 像素 footprint 上,每块 tile 64 个 2×2 像素 quad 样本,位置用高斯–泊松分布,图案在画面上重复(讲义 slide 23)。交错压掉了 small-tile 伪影,方形 big-tile 伪影仍在,因为蓄水池是在 small-tile 中心点上被点采样的(讲义 slide 24)。第二处修法是在相邻 big-tile 之间做随机双线性,靠随机偏移 small-tile 中心点实现,方块伪影消失,剩下的交错小 tile 已适合时空去噪(讲义 slide 25)。下一章转到第二级的 PDF,看它为了更准付出什么。

8Small-Tile 的 PDF 与它承认的偏差

上一章把样本在画面上摆平了,样本本身选得准不准是另一回事。第二级要在 16 个候选里挑出 1 到 4 盏灯,挑谁由这一级的 PDF 决定,而讲者在这一级第一次把方案的一处偏差摆到台面上。

为 small-tile 用的 PDF 更精细,目标是更好地估计光源对这块 tile 的重要性(讲义 slide 26)。做法叫随机 PDF 求值(stochastic PDF evaluation),在 64 个 quad 样本点里随机取 4 个,用光源的带阴影照度(shadowed illuminance)与 BRDF(双向反射分布函数)求这几个点上的平均反射亮度。只取 4 个是用少数代表点概括整块 small-tile 的反射亮度,以此压低这次求值的成本;讲义没有交代取 4 这个数的来历。

页内把这个 PDF 实际算的东西写明了,是「视见效率(luminous-efficiency)加权的光照照度 × BRDF」之积(讲义 slide 26)。这条式子有个直接后果,材质与光源被假定为单色(monochromatic)。红光打在蓝面上这类组合的 PDF 因此偏高,因为加权发生在照度与 BRDF 相乘之前,颜色之间的组合关系被丢掉了。

讲义把这里付出的代价写明,更好的做法是在 RGB 照度与 BRDF 相乘之后再加权,这样红光打蓝面会得到更低的 PDF,目前为性能放弃了这一做法,代价是噪声略增(讲义 slide 26)。它同时点出阴影项怎么影响噪声,如果某块 tile 对这盏灯完全处于阴影里,或者 tile 的所有法线都背向这盏灯,这盏灯就不会被选进照明求值,噪声随之下降。

Small-Tile PDF 页
图 8-1 E 类·证据 · 讲义 slide 26 · 原样引用 怎么读 ①指认:这一页给出 small-tile PDF 的做法,在 64 个 quad 样本点里随机取 4 个,用光源的带阴影照度与 BRDF 求平均反射亮度,页内注明实际算的是视见效率加权的照度与 BRDF 之积,因此材质与光源被假定为单色,并给出阴影项影响噪声的示例图。②读法(怎么读):把「随机取 4 个」读成这一级成本的来源,把「先加权再相乘」读成一处为性能留下的让步,读的时候对照上一章看这 4 个点是从哪批样本里取的。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

PDF 里的 BRDF 换过两轮(讲义 slide 27)。最初用的是 Lambert BRDF,后来换成带镜面的 BRDF,为的是把镜面噪声压下去;最终发现 Lambert + Blinn-Phong 对 PDF 来说是个够好但更便宜的近似,它服务的是照明里最终的 Lambert + GGX BRDF。讲义只用「够好但更便宜」评价它,未给与 GGX 的误差量级。备注另说,目前只支持一种受光 BRDF,将来为多种 BRDF 各配一套 PDF 近似可能更好。

为压 ALU 与 VGPR(向量通用寄存器)的压力,先对 tile 样本点上的材质参数按视见效率加权、取一个平均值,再把这同一组参数用在各点的反射亮度计算里(讲义 slide 27)。

理想情况是 PDF 在 tile 反射亮度非零的地方处处非零,实际做不到(讲义 slide 28)。讲义举的例子是,4 个 PDF 样本点可能全部落在阴影里,而 tile 内仍有像素是受光的。这时第二级按 PDF 挑出来的候选会偏,产生的现象是带偏向的照明边缘噪声,页内用红箭头标出位置;在 TAA(temporal anti-aliasing,时域抗锯齿)处理后的画面里,这处噪声表现为该区域轻微变暗。这种偏差在光照简单的区域最明显。缓解办法是给带阴影的 cosine 项加一个小偏移,再乘进 PDF;加上这个小偏移,等于让完全落在阴影里的情形不再把 PDF 压到 0,偏置因此变小;讲义没有给出这个小偏移的取值。去噪之后偏差基本消失,不易察觉。

Small-Tile PDF 偏差页
图 8-2 E 类·证据 · 讲义 slide 28 · 原样引用 怎么读 ①指认:这一页把一处偏差摆到台面上,理想是 PDF 在 tile 反射亮度非零处处处非零,实际上 4 个样本点可能全落在阴影里,由此产生带偏向的照明边缘噪声,页内用红箭头标出位置,下方的 TAA 图里表现为该处轻微变暗,并给出缓解办法与去噪后的效果。②读法(怎么读):把这一页读成本章最需要如实转述的一页,偏差在光照简单处最明显,缓解靠给带阴影的 cosine 项加小偏移,读的时候不要把它读成已经彻底解决。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

本章可核对的结论有四条。第二级的 PDF 用随机求值,在 64 个 quad 样本点里随机取 4 个,用带阴影照度与 BRDF 求平均反射亮度,实际是视见效率加权的照度与 BRDF 之积,因此材质与光源被假定为单色(讲义 slide 26)。讲义自陈,更好的做法是在 RGB 乘积之后加权,目前为性能放弃,代价是噪声略增(讲义 slide 26)。PDF 里的 BRDF 从 Lambert 换到带镜面的版本,最终定为 Lambert + Blinn-Phong,作为对 Lambert + GGX 的便宜近似,并为降 ALU 与 VGPR 压力先对视见效率加权的材质参数取平均(讲义 slide 27)。这一级同样做不到处处无偏,PDF 做不到处处非零,4 个样本点可能全落在阴影里,由此产生带偏向的照明边缘噪声,在光照简单处最明显,缓解办法是给带阴影的 cosine 项加小偏移,去噪后基本消失(讲义 slide 28)。下一章把这一级的 16 个候选拆成 N 条流,收进一张更小的渲染目标。

9Small-Tile 的蓄水池:拆成 N 条流与一张小 RT

上一章把第二级采样的 PDF(probability density function,概率密度函数)与它承认的偏差摊开,也说到四个 PDF 样本点可能全落在阴影里,从而带出带偏向的照明边缘噪声(讲义 slide 26、28)。样本本身怎么落进 small-tile(小区块)蓄水池(reservoir)、这一级要花多少,是本章的内容(讲义 slide 29、30)。

small-tile 重采样沿用 big-tile(大区块)那一套 SRS(Stratified Reservoir Sampling,分层蓄水池采样)策略(讲义 slide 29)。做法与第一级同形,把 16 个 big-tile 候选拆成 N 条独立流,讲义给的示例是 N 等于 4。拆流同第一级把光源拆成 16 条流是同一个手法,一条流在某一轮里只处理一批候选,流与流之间各走各的。讲义把结论说得很直白,重采样成本不随 N 变化;真正影响这一 pass 总成本的只有两处,一处是 big-tile 蓄水池的大小,一处是 small-tile PDF 的开销。N 变大只是流数变多、每条流分摊的候选变少,总工作量由固定的 16 个候选与单次 PDF 求值决定。

这套打法与第一级能对上,是因为两级的候选池性质不同(讲义 slide 29)。第一级面对的是场景里的全部光源,数量随创作者摆放而变;第二级面对的是固定的 16 个 big-tile 候选,上限由 big-tile 蓄水池大小定死。讲义把第二级的成本说成与场景光照复杂度无关,依据也在这里,无论场景里有多少盏灯,进到这一级的候选始终是那 16 个,想用几个样本这个旋钮只在流数上生效,不会把这一 pass 的账拖着走。

起点与打乱方式也照搬上一级(讲义 slide 29)。先取 big-tile 蓄水池的前 N 个样本充当各条流的起点,下一轮把接着的一批 4 个样本带随机偏移地打乱到各条流上,用意是降低高权重光源在邻近 small-tile 上争抢同一槽位的概率;重复下去,直到 16 个 big-tile 样本全部处理完。收尾时得到 N 个(示例 4 个)互不重复的高质量光源样本,交给后面的照明求值使用。两级的差别落在候选来源与 PDF 的精度上,流程的骨架一致。

存储写在下一页(讲义 slide 30,本页续自 slide 29 的备注)。small-tile 蓄水池从像素着色器导出到一张 1 到 4 通道、每通道 32 位的纹理,通道数与 N 对齐。1080p 下这张渲染目标只要 120×68 像素,按蓄水池大小占 32 KB 到 128 KB。与 big-tile 那张 60×36 像素的渲染目标相比,这是整条管线里第二处用极小纹理换取低频数据的地方;两张都属页内文本,行列对应未做人工核对,本章只引讲义给出的量。

同页还配有 small-tile 槽位重采样的代码片段(讲义 slide 30)。片段遍历 big-tile 蓄水池里的样本,每一轮先求该光源的 PDF,再算一个用于抵消 big-tile 采样偏置的重采样 PDF,用后者按概率挑灯,完成后把灯与权重写进蓄水池。这一步里出现的两个 PDF 分工不同,一个估光源对当前 tile(区块)的重要性,另一个把第一级引入的偏置补回来,多出来的那次求值也花在这里。

Small-Tile 蓄水池的流拆分页
图 9-1 E 类·证据 · 讲义 slide 29 · 原样引用 怎么读 ①指认:这一页把第二级重采样的流拆分讲开,big-tile 候选被分到若干条互相独立的流上,各条流从蓄水池前端起步,后续批次带随机偏移打乱到各条流,页内点明重采样成本与 N 脱钩。②读法(怎么读):接在上一章的 PDF 之后读;存储那张小渲染目标的账在下一页。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

本章可核对的结论有三条。small-tile 重采样沿用 big-tile 的 SRS 策略,把 16 个 big-tile 候选拆成 N 条独立流(示例 N 为 4),重采样成本与 N 无关,真正影响这一 pass 总成本的只有 big-tile 蓄水池大小与 small-tile PDF 的开销(讲义 slide 29)。流从蓄水池前 N 个样本起步,之后把后续样本带随机偏移地打乱到各条流上,以降低高权重光源在邻近 small-tile 上的争抢,最后得到 N 个互不重复的高质量样本(讲义 slide 29)。存储方面,蓄水池从像素着色器导出到 1 到 4 通道、每通道 32 位的纹理,1080p 下为 120×68 像素、按蓄水池大小占 32 KB 到 128 KB(讲义 slide 30)。下一章看这些样本的阴影项怎么算。

10把阴影拆出去单独算

上一章把 small-tile 蓄水池拆成 N 条流,收尾时手上有 N 个互不重复的高质量光源样本(讲义 slide 29)。这些样本的阴影项怎么算,本章给出答案,做法是把阴影从最终照明着色器里拿出去,单独跑一趟(讲义 slide 32 至 slide 38)。

延后阴影 pass 与最终照明 pass 解耦(讲义 slide 32)。最直接的收益落在分辨率上,阴影按每 2×2 像素 quad(2×2 像素组)求一次,求值次数降到四分之一(讲义 slide 32 备注)。这趟 pass 与 tile-based rendering(基于 tile 的渲染)绑在一起,阴影项按每块 tile 的 8×8 像素块存放,一块 small-tile 对应 64 个 quad 样本,讲义说这种组织减少 wave(线程波)发散(divergence)。代码层面有一处省事,聚光灯与全向光的阴影求值代码大体统一,只有太阳光走级联阴影图(cascaded shadow maps)这一条单独路径。为省内存与带宽,阴影项只用 8 位并加 1 位时序噪声,配合 TAA(temporal anti-aliasing,时域抗锯齿)消除条带,1080p 下约 0.5 MB 起(备注续到 slide 33)。

解耦还换回两笔好处(讲义 slide 32、33)。与光源类型相关的阴影采样移出主着色器之后,数据读取与 VGPR(向量通用寄存器)压力都降;阴影求值不在主着色器里,就可以用阴影图、光追等不同技术实现,换技术不影响最终照明着色器的性能。

延后阴影 pass 页
图 10-1 E 类·证据 · 讲义 slide 32 · 原样引用 怎么读 ①指认:这一页讲延后阴影 pass,阴影与最终照明解耦、按 2×2 像素 quad 求值,阴影项按 tile 的 8×8 像素块存放,页内列出解耦换回的好处与 8 位加 1 位时序噪声的存法。②读法(怎么读):把它当成阴影这一段的入口,后面的图集、更新与滤波都从这页出发。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

阴影图本身放在一张图集里(讲义 slide 34)。这张阴影图集(shadow map atlas)持续存在、动态管理,位深 16bpp,装的是方形、边长为 2 的幂的聚光灯与全向光阴影图。聚光灯用标准投影阴影图,全向光用八面体阴影图(octahedral shadow map)。图集空间有限,讲义的处理是按光源到相机的距离缩放阴影图分辨率,用距离换质量。

图集怎么更新在下一页(讲义 slide 35)。先把光源范围内的几何渲进临时深度缓冲,再拷进图集;聚光灯从光源视角渲普通深度缓冲,拷贝时对深度值做线性化与偏置,全向光渲立方体贴图到深度缓冲,拷贝时还要把立方体各面映射到八面体空间。两种拷贝都会补 2 像素边界,用来支持 PCF(百分比邻近滤波)滤波。阴影图分静态与动态两类,静态图只含静态几何、只在光源变换或阴影分辨率变化时才更新,动态图含静态与动态几何、持续更新且代价更高;备注另补,图集更新负载在多帧之间均衡(讲义 slide 36)。

阴影图集更新页
图 10-2 E 类·证据 · 讲义 slide 35 · 原样引用 怎么读 ①指认:这一页讲阴影图集的更新流程,几何先渲进临时深度缓冲再拷入图集,拷贝时做线性化与偏置、补边界,全向光另要映射到八面体空间;页内区分静态图与动态图的更新时机。②读法(怎么读):与上一页的分辨率收益对照着读,这页交代图集怎么长期维持。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

滤波这一步做在再下一页(讲义 slide 37)。讲义用 4-tap「硬件」PCF 配随机 PCF 得到更柔和的阴影,每次阴影项求值只需要 1 次 gather。这一步同时把所选的 IES 光型(IES profile)与角度衰减乘进阴影项,阴影带上与具体光源相关的形状衰减;IES 光型也用在小一级的 small-tile PDF 求值上,用途是降噪。讲义在后面留了三条升级路,PCSS(接触硬化软阴影)、屏幕空间光线步进的细节阴影、光追阴影,其中光追可以在高端设备上启用。

阴影滤波页
图 10-3 E 类·证据 · 讲义 slide 37 · 原样引用 怎么读 ①指认:这一页讲阴影滤波,硬件 PCF 与随机 PCF 配合、每次求值只要一次 gather,页内把 IES 光型与角度衰减一并乘进阴影项,并列出后续升级路。②读法(怎么读):把它读成阴影这一段的效果收束,滤波做法与第 12 章的成本读数相关。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

quad 分辨率不是没有代价(讲义 slide 38)。一个 2×2 像素 quad 共享一个阴影项在多数情况下表现良好,物体轮廓处可能出伪影,那里的 quad 内像素本该有相当不同的阴影项。讲义给的缓解是随机化 tile 采样与 TAA 大体上把它压住,边缘仍可能留下细微的照明偏差;实在需要质量时可以回退到全分辨率阴影求值,代价是成本上升。

本章可核对的结论有三条。解耦换来四分之一求值量、更简单的照明着色器、更低的 wave 发散与数据读取与 VGPR 压力、可替换的阴影技术,阴影项按 tile 的 8×8 像素块存放、用 8 位加 1 位时序噪声,1080p 下约 0.5 MB 起(讲义 slide 32、33)。图集是动态管理的 16bpp 图集,聚光灯用投影阴影图、全向光用八面体阴影图,静态图按变换或分辨率变化更新、动态图持续更新(讲义 slide 34 至 slide 36)。滤波用 4-tap 硬件 PCF 配随机 PCF、每次求值 1 次 gather,同时应用 IES 光型与角度衰减(讲义 slide 37、38)。

11照明求值、去噪与画面

上一章把阴影项从照明着色器里拿出去,剩下的一步是照明求值(讲义 slide 32、37)。本章看这一步怎么在像素着色器里完成,接着看仍在进行中的去噪这一节,最后看目前放出来的画面。

照明求值第一步是取数据(讲义 slide 40)。要取的是该像素的 small-tile 光源样本与阴影项。讲义希望这一步也跑在像素着色器里,于是需要把屏幕像素映射回 small-tile 与样本索引,做法是用一张 16×16 的 8bpp 反查表(LUT / look-up table,查找表),把屏幕空间的 quad 坐标连到交错的 tile 与样本索引上;有了它,光源样本与阴影项都能取到。讲义另给一条对照,compute 实现不需要反查表,可以直接对 tile 的像素求值,用散写把照明结果写进照明缓冲。取到数据之后是累加,逐个光源样本累加 Lambert + GGX 的贡献,按样本权重与它的阴影项加权,最后写进照明缓冲。因为每块 tile 固定存 1 到 4 个光源样本,这一步的成本同样与场景光照复杂度无关;讲义备注续到下一页,照明求值本身相当便宜,若改用 compute,还能把 tile 的像素打包进 wave 连贯求值,进一步降低发散(讲义 slide 41)。

照明求值页
图 11-1 E 类·证据 · 讲义 slide 40 · 原样引用 怎么读 ①指认:这一页讲照明求值,先取该像素的光源样本与阴影项,用一张反查表把屏幕空间的 quad 坐标连回交错的 tile 与样本索引,再逐个样本累加 BRDF 贡献、按样本权重与阴影项加权写进照明缓冲。②读法(怎么读):接在阴影那一段之后读,这一页把前两步的数据合成成照明缓冲。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

去噪(denoising)这一节讲者标成进行中(讲义 slide 42、43)。为压低去噪成本,团队的计划是改造 TAA 让它兼任去噪器,从而不必单开一趟去噪 pass,那样会多花带宽。难点出在标准 TAA 为压鬼影(ghosting)所做的 3×3 像素邻域历史颜色截断:噪声输入下,像素邻域在某些帧里没有渲染到关键光源,颜色范围被限死,于是出现闪烁的照明光斑(讲义 slide 43 页内中图)。讲义列了几条可选的处置方向,让颜色截断更兼容噪声输入、改换别的鬼影抑制手段、提供更适配 TAA 的输入数据,或者把几者组合。这一块仍是活跃的研发项,讲义没有给出已定案的方案。

去噪(进行中)页
图 11-2 E 类·证据 · 讲义 slide 43 · 原样引用 怎么读 ①指认:这一页是去噪一节,讲者把它标成进行中,计划让 TAA 兼任去噪器以免多开一趟 pass,页内指出标准 TAA 的历史颜色截断在噪声输入下会造成闪烁的照明光斑,并列出几条待选的处置方向。②读法(怎么读):把它读成一处未定案,页内中图给的是问题本身,不要当成已解决。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

画面这一页给的是 1spp 与 4spp 的对照(讲义 slide 45,spp 即 samples per pixel,每像素采样数)。噪声图上 1spp 更噪;在 TAA 图上,4spp 能还原更细的光照细节,讲义举的例子是复杂几何上的锐利镜面反射。讲者的观感是两者收敛后相当接近、差别不大。这一页与下一页 slide 46 内容重复,图集只收 slide 45。

画面结果 1spp vs 4spp 页
图 11-3 E 类·证据 · 讲义 slide 45 · 原样引用 怎么读 ①指认:这一页给 1spp 与 4spp 的对照,一边是噪声图、一边是 TAA 图,页内并排列出两种采样数在同一场景下的差异。②读法(怎么读):噪声图与 TAA 图要分开看,前者的差异随采样数直观看得出,后者的差异讲者说收敛后并不大。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

还有一组画面结论要带上(讲义 slide 47,该页未取进图集)。big-tile 蓄水池的样本数从 4 到 64 扫描时,减少样本会让画面整体变暗,越远处越明显,讲义把这处变暗归到偏置上,成因是裁光权重压萤火虫(firefly)时留下的偏置。反过来,样本越多噪声越低、光照细节越好,因为小一级的重采样能从更丰富的集合里取到更相关的样本。这一组结论与第 12 章的成本取舍接在一起,降蓄水池大小是最省事的降本手段,代价就是噪声与这处变暗。

本章可核对的结论有三条。照明求值先取该像素的光源样本与阴影项,用一张 16×16 的 8bpp 反查表把屏幕 quad 坐标映射回 tile 与样本索引(compute 实现不需要这张表),再逐个样本累加 Lambert + GGX 贡献、按样本权重与阴影项加权,成本与场景光照复杂度无关(讲义 slide 40、41)。去噪尚未定案,计划让 TAA 兼任去噪器,难点是历史颜色截断在噪声输入下会造成闪烁光斑,讲义只列了处置方向(讲义 slide 43)。画面方面,噪声图上 1spp 更噪,TAA 图上 4spp 能还原更细的光照细节,两者收敛后相当接近、差别不大;big-tile 蓄水池样本减少会让画面整体变暗,是裁光权重压萤火虫造成的偏置(讲义 slide 45、47)。

12代价:$99 机、$1000 机与笔记本上的实测

上一章的照明求值与画面都落在纸面,本章把它们放上三台设备(讲义 slide 53 至 slide 57)。读数之前先把口径记住,这些数字只含直接光,且绑定机型、分辨率与场景。

测试硬件有三台(讲义 slide 53)。最弱的一台 GPU 是 Adreno 610,见于今天的 $99 机,算力与带宽大致相当于 Xbox360 与 PS3,功耗 3W。第二台是 Adreno 830,见于 $1000 机,大致相当于约十年前的主机与桌面 GPU,功耗 5W。第三台是 RTX 4070 笔记本。讲义另有一条口径,弱机使用更低的渲染分辨率。

测试硬件页
图 12-1 E 类·证据 · 讲义 slide 53 · 原样引用 怎么读 ①指认:这一页列出做性能剖析的三台设备,一台最弱的 Android 目标机、一台高端 Android 与一台笔记本。②读法(怎么读):把它当成后面所有读数的机型口径页,凡出现毫秒数都要回到这一页对齐机型。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

先做的是同条件对照(讲义 slide 54)。把原来只算带阴影太阳光的照明与 STB 照明放在一起比,讲者的观感是画面看起来几乎一致,主要差别在太阳阴影的求值粒度,STB 按 2×2 像素 quad 求值、不逐像素求值,所以阴影略软。这属主观观感,讲义没有给出量化值。

直接光成本写在下一页(讲义 slide 55)。讲者先交代口径,他们的照明 pass 还要算镜面与漫反射 IBL(基于图像的光照)、SSAO(屏幕空间环境光遮蔽)上采样等,但这些数字只含直接光。1spp 随机照明在 Adreno 610 上只增加 0.66 毫秒,考虑到它同时接管了任意局部光源,这个增幅相当温和;Adreno 830 与 RTX 4070 上约增 0.35 毫秒,绝对量更小,相对增幅却更高,讲义判断这两台有望靠 compute 实现与 pass 合并补回差距。

直接光成本页
图 12-2 E 类·证据 · 讲义 slide 55 · 原样引用 怎么读 ①指认:这一页给直接光成本的对照,页内先交代口径,数字只含直接光。②读法(怎么读):先记住口径,再按机型分别看增幅,不要把它们当同一档。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

随 spp 的伸缩写在 slide 57(讲义 slide 56、57)。这一组场景含 50 盏相机视锥内的局部光源,与上一组不是同一套条件。这里仅太阳光反而更贵一些;1spp 在弱机上再增约 1.5 毫秒,在高端机与笔记本上约 0.5 毫秒。讲义点出 Small-Tile SRS 在弱机上比上一场景贵了 3 倍,因为它要从完整的 big-tile 蓄水池重采样。随之给出两条取舍,降低 big-tile 蓄水池大小是降成本最容易的办法,代价是噪声增加;4spp 在弱机上相当贵,在高端机与笔记本上还算合理。讲义另说 big-tile SRS 仍然很便宜,光源数量再大成为问题时可以改成均匀采样做成固定成本。另有 500 盏灯的场景,讲义只报 big-tile 采样这一个 pass,各平台仍是 0.02 毫秒。

随 spp 伸缩页
图 12-3 E 类·证据 · 讲义 slide 57 · 原样引用 怎么读 ①指认:这一页给随 spp 伸缩的读数,场景含 50 盏相机视锥内的局部光源,并附 500 盏灯场景的 big-tile 采样读数。②读法(怎么读):与上一页的机型口径连看,这一页换了场景,两组数字不可互相套用。 来源:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · Stochastic Tile-Based Lighting in HypeHype · 讲者 Jarkko Lempiäinen(HypeHype)· 未修改引用

收尾一页给未来工作(讲义 slide 59,附录 slide 60),讲者自陈整套开发仍是进行中的工作,但质量与性能都令人鼓舞。可分七类:compute 着色器版本并跨设备剖析;用 compute 把 small-tile 重采样、阴影、照明三趟合并成一趟,预期 PC 与控制台受益明显;继续改进 TAA 承担去噪,照亮的灯越多噪声越高;改进 big-tile PDF(按深度上的像素数加权、聚光灯锥不相交时置 0)与 small-tile PDF(把 4 次带阴影照度与 BRDF 求值降成 1 次保守阴影求值加单次保守 BRDF 求值);参数调优;半透明与体积光照,目前只支持 G-Buffer(几何缓冲)里的完全不透明表面。

本章可核对的结论有两层。设备方面,三台测试机是 Adreno 610($99 机、3W)、Adreno 830($1000 机、5W)与 RTX 4070 笔记本,弱机用更低的渲染分辨率,同条件对照下画面几乎一致,差别是太阳阴影按 2×2 quad 求值所以略软(讲义 slide 53、54)。成本方面,数字只含直接光,1spp 在 Adreno 610 上只增 0.66 毫秒、在 Adreno 830 与 RTX 4070 上约增 0.35 毫秒,在 50 盏相机视锥内局部光源的场景 1spp 在弱机上再增约 1.5 毫秒,500 盏灯场景的 big-tile 采样仍是 0.02 毫秒(讲义 slide 55、57)。这场的读数与口径边界,按顺序收在下面八条里。

边界 1: 成本读数只含直接光。讲义 slide 55 与 slide 57 的数字排除镜面与漫反射 IBL、SSAO 上采样等,不可当作完整帧成本。

边界 2: 读数口径不可混。Adreno 610($99 机、3W、更低渲染分辨率)、Adreno 830($1000 机、5W)与 RTX 4070 笔记本三台设备;slide 57 那组是 50 盏相机视锥内局部光源;500 盏灯场景只报 big-tile 采样 0.02 毫秒。互不可套用与外推。

边界 3: 讲者自陈的偏差与让步。slide 28 的 PDF 无法处处非零,带出带偏向的照明边缘噪声;slide 26 为性能放弃在 RGB 乘积之后加权(材质与光源假定单色);slide 47(未取图页)减少 big-tile 蓄水池样本会让画面整体变暗,是裁光权重压萤火虫的偏置;slide 17 假设 tile 像素在深度界内均匀分布而可能不成立。

边界 4: 未竟项。去噪尚未定案(slide 43、59,讲者称当前最大挑战);只支持 G-Buffer 里的完全不透明表面,半透明与体积光照尚未支持(slide 59、60);compute 实现与「最后三趟合并成一趟」尚未做(slide 59);两级 PDF 都已知可改进(slide 60)。

边界 5: 与篇目 10(MegaLights)与篇目 36(idTech8 GI)不可直接横比。同属大规模光源与 GI 的成本控制,但厂商、硬件档位、分辨率与帧预算都不同,只能逐项对齐条件后对读。

边界 6: 与 ReSTIR 系不是一回事。本篇是空间分层的两级蓄水池采样、不带时序复用;篇目 2/9/24 的 ReSTIR 系做时空重采样,机制与带宽画像不同。

边界 7: 页内表格行列未经人工核对。slide 53(设备属性与功耗)、slide 55/57(逐 pass 计时与 spp 伸缩)、slide 16(32 位位域与 60×36 像素)、slide 29/30(120×68 像素、32 KB–128 KB)都是页内文本,正文只引幻灯文本与备注明确给出的数值。

边界 8: 许可与出处。讲义页内无 CC 声明(页脚只有课程名),slide 8 的 Sponza 模型另有第三方署名(© 2010 Frank Meinl, Crytek,经 Morgan McGuire 图形档案下载);讲义未给代码仓库或开源链接;slide 63 的 PRNG 代码是讲义自带片段。

13贡献块

这一篇的贡献(精读视角)

三条可搬走的做法与站内互读

一场讲「怎么让任意多盏动态灯在 $99 手机上跑得动」的讲座,能留下的东西集中在三处:把采样单位从像素搬到 tile、用两级精度不同的 PDF 接力把成本钉在常数上、以及把「样本在画面上怎么摆」当成算法的一部分。三处都没有新数学,用的是把已有零件重新排布到能满足带宽、散热与创作者行为这三重约束的位置上;本篇因此更适合当作一份在绝大多数渲染器都把光源采样放在像素这一级的世界上,换一个采样单位从零搭一套照明的工程记录来读。

贡献 1:把采样单位从像素换成 tile,并把「能用像素着色器写完」当成设计约束。 最要紧的一步是把最小的工作单位从像素抬到 tile:一块 tile 上只存一组光源样本,被这块 tile 的像素共用(讲义 slide 12)。样本单位的这一抬同时解决三件事 —— 访存量降、带宽降、wave 发散降,而一个 wave 里的线程还能走同一条执行路径、访存连贯(讲义 slide 12)。另一处要点在第二条约束的来源:移动端的带宽红利挂在基于 tile 的渲染与帧缓冲压缩上,而这两样只对着像素着色器那条路开,所以「全部各趟都能用像素着色器实现」在这里是一条设计约束,不是实现细节 —— 讲义把它单独列成一条,并注明目的就是吃到 TBR 与 FBC(讲义 slide 12)。讲者也顺手交代了退路:改成计算着色器在某些硬件上还能更快,只是整套设计并不依赖它(讲义 slide 12 备注)。

贡献 2:两级精度不同的 PDF 接力,把第二级的成本钉在常数上。 随机采样这条路上,决定成败的是重要性函数;为每块 tile、每盏灯精确算 PDF 太贵,于是整套采样分成两级(讲义 slide 12)。第一级用一条由层级 MinMax 深度缓冲的上下界构成的中心线段,在最近点处求全向光的标量照度,便宜到只用到两个深度值,且因为 PDF 处处为正而不引入偏置(讲义 slide 17);第二级换用带可见性与 BRDF 的随机求值,在 64 个 quad 样本点里随机取 4 个求平均反射亮度(讲义 slide 26)。两级之间真正起作用的是一处结构安排:第二级面对的候选池被钉死成那 16 个,与场景里有多少盏灯无关(讲义 slide 29),于是「成本与场景光照复杂度脱钩」这句话在第二级才真正成立,想调样本数只需动流数 N,而 N 本身不进成本(讲义 slide 29)。这条分工可以整体搬走:用一级极便宜的粗筛把候选数降下来,再用一级贵的精筛在固定大小的候选池上做第二次抽样。

贡献 3:把样本的摆法当成算法的一部分,并把阴影从主路径上移开。 样本从哪来解决了,摆在哪里是另一个问题,而讲者把它当成正题处理:规则 16×16 网格会因采样相关性出 tiling 伪影(讲义 slide 22),第一处修法是交错采样 —— 4 个相邻 tile 铺在 32×32 像素 footprint 上、每块 64 个 2×2 像素 quad、位置按高斯–泊松分布(讲义 slide 23);交错之后方形 big-tile 伪影仍在,因为蓄水池是在 small-tile 中心点上被点采样的,第二处修法就改成随机双线性,靠随机偏移中心点把方块抹平(讲义 slide 25)。同类动作还出现在阴影上:把阴影项从照明着色器里拿出去单独跑一趟,换来四分之一的求值次数、更简单的照明着色器与可替换的阴影技术(讲义 slide 32)。三处是同一个思路 —— 把不影响主路径的精度降下来、把不必要的东西移出主路径,而每一处都留了诚实的注脚:交错之后仍能看到交错的小 tile(讲义 slide 25),quad 共享阴影项在物体轮廓处会出伪影(讲义 slide 38)。

站内可以接着读的几篇:篇目 10(MegaLights,Epic)与篇目 36(idTech8 GI,id Software)与本篇属同一问题域(大规模动态光源的成本控制),但本篇定位是最低那档移动端,硬件、分辨率与帧预算都不在同一量级,三篇读数不可直接横比。篇目 2、篇目 9 与篇目 24 的 ReSTIR 系与本篇不是一回事 —— 那三篇做的是时空重采样(借上一帧的邻域),本篇做的是空间上的两级分层,全程不带时序复用(讲义 slide 9、29)。篇目 19(PowerVR 硬件架构)就是本篇五项手机端约束的底子 —— 基于 tile 的渲染、帧缓冲压缩与被动散热这一组,篇目 19 讲硬件为什么这么设计,本篇讲算法怎么顺着它写。另外,本篇未来工作里的半透明与体积光照(讲义 slide 59–60)与篇目 29(Smolder,实时体积效果)处理的量相邻,两篇合起来能看到「体积里怎么采样」的两种做法。本篇讲义未给代码仓库或开源链接,slide 63 的附录是讲义自带的 Fast GLSL PRNG 代码片段。

14原文出处块

原文出处

原文出处与引用口径

出处:SIGGRAPH 2025 · Advances in Real-Time Rendering in Games course · 2025-08 · 讲者 Jarkko Lempiäinen(Principal Graphics Engineer, HypeHype)· 官方讲义《Stochastic Tile-Based Lighting in HypeHype》,64 页,540×720 pt(竖版),来源 PDF 2025-siggraph-advances-hypehype-stb.pdf

材料:官方讲义 64 页,其中 40 页带讲者备注;幻灯区有实时文本层(63/64 页的要点、伪代码与数值表都可选),本篇事实同时取自幻灯文本与讲者备注;页码为 PDF 页序(从 0 起),引用写作「讲义 slide N」。讲者开篇报出来处:过去二十五年做 AAA 渲染(Ubisoft、Unity、Treyarch),约一年前加入 HypeHype,引擎原本只支持带阴影的太阳光(讲义 slide 1、2)

许可:讲义逐页检索只在 slide 8 命中一次 ©,内容是 Sponza 模型的第三方素材署名(Sponza model © 2010 Frank Meinl, Crytek / Downloaded from Morgan McGuire's Computer Graphics Archive),不是本讲义的整体许可;其余 63 页页脚只有课程名,未检到 Creative Commons / CC BY / MIT / License 任何声明,亦未检到代码仓库或开源链接。故 26 件图按分区非 CC 口径逐件署名(图号 + slide 号 + 出处 + 「未修改引用」),并在构建记录标注残留风险(讲义未授权转载,条款以官方发布为准),不得写成 CC 或可自由转载;slide 63 的 PRNG 代码是讲义自带片段,不是可引用的开源许可

引用口径:成本读数只含直接光 —— 讲义 slide 55 与 slide 57 的数字明确排除镜面与漫反射 IBL、SSAO 上采样等,不可当作完整帧成本。读数四组口径不可混:① Adreno 610(今天的 $99 机、算力与带宽大致相当于 Xbox360 与 PS3、功耗 3W、弱机使用更低的渲染分辨率);② Adreno 830($1000 机、大致相当于约十年前的主机与桌面 GPU、功耗 5W);③ RTX 4070 笔记本(讲义 slide 53)。在这个口径下,1spp 随机照明在 Adreno 610 上只增加 0.66 毫秒,在 Adreno 830 与 RTX 4070 上约增 0.35 毫秒(绝对量更小、相对增幅更高,讲义 slide 55);④ 另一组来自含 50 盏相机视锥内局部光源的场景,其中仅太阳光反而更贵一些,1spp 在弱机上再增约 1.5 毫秒、在高端机与笔记本上约 0.5 毫秒,且 Small-Tile SRS 在弱机上比上一场景贵了 3 倍(讲义 slide 57)。另有一个 500 盏灯的场景只报了 big-tile 采样这一个 pass,各平台仍是 0.02 毫秒(讲义 slide 57 备注)。讲者自陈的偏差与让步一并保留:small-tile 的 PDF 做不到处处非零,4 个样本点可能全落在阴影里,由此产生带偏向的照明边缘噪声(在光照简单处最明显,缓解办法是给带阴影的 cosine 项加一个小偏移,取值讲义未给,讲义 slide 28);为性能放弃了在 RGB 照度与 BRDF 相乘之后加权,因此材质与光源被假定为单色(讲义 slide 26);big-tile 的 PDF 假设 tile 像素在深度上下界之间大致均匀分布,而这可能不成立(讲义 slide 17);减少 big-tile 蓄水池样本会让画面整体变暗,是裁光权重压萤火虫留下的偏置(讲义 slide 47)。未竟项同样保留:去噪尚未定案,讲者称当前最大的挑战就是让 TAA 在噪声输入下好好工作(讲义 slide 43、59);目前只支持 G-Buffer 里的完全不透明表面,半透明与体积光照尚未支持(讲义 slide 59、60);compute 实现与「把最后三趟合并成一趟」尚未做(讲义 slide 59);两级 PDF 都已知可改进(讲义 slide 60)。不与任何商用方案横比:本篇与篇目 10、篇目 36 属同一问题域,但厂商、硬件档位、分辨率与帧预算都不同,只能逐项对齐条件后对读。篇幅说明:正文按 15,000–20,000 汉字写,事实全部来自幻灯文本与讲者备注;页内表格(讲义 slide 53、55、57、16、29、30)的行列对应未经人工过图核对,正文只引讲义明确给出的数值。