随机分块光照(Stochastic Tile-Based Lighting)—— HypeHype 的移动端光照方案
SIGGRAPH 2025 Advances: STOCHASTIC TILE-BASED LIGHTING IN HYPEHYPE
项目背景与动机
HypeHype 平台简介
- HypeHype 是一个 用户生成内容(UGC)平台 ,目标设备覆盖从 $99 低端手机到高端 PC 。
- 平台已有约 50 万款用户创建的游戏 ,任何人可以游玩或二次创作。
- 核心理念:让 无技术背景的普通用户 也能轻松、有趣地创作游戏。
- 演讲者 Jarkko Lempiäinen 加入时,引擎仅支持 带阴影的太阳光(Shadowed Sunlight) ,他开始开发 局部光照(Local Lighting) 方案以提升画面质量。
移动端的硬件约束
- 内存带宽 是移动端最关键的瓶颈:
- 低端手机峰值带宽约 15 GB/s ,ALU 算力约 250 GFLOP/s (与 20 年前的 Xbox 360 / PS3 相当)
- 高端手机峰值带宽约 85 GB/s
- 对比:Xbox Series X / PS5 Pro 带宽超过 500 GB/s ,算力 12~17 TFLOP/s
- 移动设备采用 被动散热 ,带宽密集操作会迅速导致 发热和降频(Thermal Throttling)
- 关键数据:GPU 与 DRAM 之间搬运 1 字节数据 的能耗是一次简单 ALU 运算的 100 倍
移动 GPU 的 Tile-Based Rendering(TBR)架构
- 移动 GPU 大量依赖 基于分块的渲染(Tile-Based Rendering) 来节省带宽:
- 画面被切分成小块(Tile),逐块渲染到 片上高速内存(On-chip Memory)
- 所有三角形光栅化完成后,才将 Tile 数据写回主存(DRAM)
- 通常使用 无损帧缓冲压缩(Lossless Framebuffer Compression) 进一步减少传输量
- 算法设计启示 :
- 尽量用 Pixel Shader 而非 Compute Shader(充分利用 TBR 架构)
- 最小化 Render Pass 数量 ,减少 DRAM 来回读写
- 从头为 fp16 设计算法——移动设备普遍支持 双倍速率 fp16 管线(Double-rate fp16)
- 减少 分支发散(Branch Divergence) ,优化 VGPR 使用
用户侧的特殊挑战
- 创作者无法理解性能权衡 ,也不会为不同硬件调节光照参数
- 光照控制必须 直观、鲁棒 ,让创作简单有趣
- 必须保证 跨设备一致性 ——在高端 PC 上创建的游戏,在低端安卓设备上也要正常运行
- 必须应对 不可预测的光源行为 :
- 例如:每个敌人死亡时生成一个光源(粉色球),导致 光源聚集(Light Clumping)
- 创作者可能在房间里直接放 50 个带阴影的灯光
- 创作者通过 资产库预制件(Prefabs) 拼装场景,预制件自带灯光,场景中灯光数量会快速增长
- 不能出现 大幅帧率下降或视觉干扰伪影
现有方案分析与不足
Tiled Deferred Lighting(分块延迟光照)
- 优点 :本地内存访问、Wave 内一致的光照计算路径,GPU 性能好
- 缺点 :
- 光照开销与 每个 Tile 的灯光数量线性增长
- 依赖美术人员精心控制灯光影响范围——不适合 UGC 平台
- 在物体 轮廓边缘(Silhouettes) ,单个 Tile 的灯光数量可能非常高
- 动态光源使光照开销 极度不可预测
- 一些引擎限制每 Tile 灯光上限,超出后出现 闪烁的 Tile 伪影
- 灯光裁剪(Light Culling) 本身开销也不小(精确的 Tile Frustum 检测)
ReSTIR(Reservoir-based Spatiotemporal Importance Resampling)
- 优点 :随机光照的固定开销,不受场景光照复杂度影响
- 缺点(对移动端而言) :
- 采样在 逐像素 级别进行
- 均匀采样(Uniform Sampling) 随机访问场景灯光,缓存极不友好 ,增加带宽消耗
- 均匀采样结果噪声大,需要额外的 时空重采样(Spatiotemporal Resampling) ——又是高带宽操作
- 逐像素采样导致同一 Wave 内灯光数据和类型随机不同,造成 不一致的数据加载和分支发散
- 综合来看,在移动端 开销过高
结论
没有现成方案同时满足低端移动端的带宽、算力、散热约束以及 UGC 平台的灯光不可预测性需求,因此开发了 随机分块光照算法(Stochastic Tile-Based Lighting) 。
随机分块光照算法总览
核心思想:逐 Tile 采样而非逐像素采样
- 对每个 Tile 存储 一组共享的灯光样本 ,Tile 内所有像素共用
- 显著降低 内存使用、带宽消耗和 Wave 发散
- 同一 Tile 内线程走 相同执行路径 ,享受 一致的数据加载(Coherent Data Loads)——与传统 Tiled Deferred 类似
全 Pixel Shader 实现
- 所有 Pass 都可以用 Pixel Shader 高效实现 ,充分利用 TBR 架构和帧缓冲压缩
- 在支持的硬件上,Compute Shader 实现可以进一步提升性能
两阶段采样:分层蓄水池采样(Stratified Reservoir Sampling, SRS)
为了以低成本获得高质量的重要性采样,算法采用 两阶段采样 :
| 阶段 | 名称 | Tile 大小 | PDF 质量 | 目的 |
|---|---|---|---|---|
| 第一阶段 | 大块采样(Big-Tile Sampling) | 128×128 px | 低成本粗略 PDF | 从全场景灯光中为每个大块选出候选子集 |
| 第二阶段 | 小块重采样(Small-Tile Resampling) | 更小 | 高质量 PDF(含可见性、BRDF) | 从大块蓄水池中为小块精选少量灯光 |
完整流水线
- CPU 端 :对场景灯光做 视锥裁剪(Camera FoV Culling)
- GPU 第一阶段 :大块采样(Big-Tile Sampling)—— SRS 选出 16 个灯光/大块
- GPU 第二阶段 :小块重采样(Small-Tile Resampling)—— 从大块蓄水池中用更精确 PDF 重采样
- 延迟阴影 Pass(Deferred Shadow Pass) :对小块灯光样本计算阴影项(与光照着色器 解耦 ,优化性能)
- 光照 Pass(Lighting Pass) :读取灯光样本和阴影项,计算 BRDF,应用正确的灯光权重,输出最终光照
设计要点 :重要性函数要尽可能准确地近似每个灯光对 Tile 的影响。例如,若某 Tile 完全处于某灯光的阴影中,理想情况下该灯光不应被选中。但为每个 Tile-灯光对计算精确 PDF 太昂贵,因此用两阶段逐步细化。
大块采样阶段(Big-Tile Sampling)详解
基本参数
- 大块尺寸:128×128 像素
- 每个大块的蓄水池容量:16 个不重复灯光
- 采样算法:分层蓄水池采样(Stratified Reservoir Sampling, SRS)
为什么用 SRS?
- SRS 是一种 无放回(Without Replacement) 采样算法
- 确保蓄水池中 无重复灯光 ,高效利用蓄水池空间
- 维持灯光集合的 多样性和代表性
- 适合 Pixel Shader 实现——每个蓄水池槽位 独立采样
灯光样本的存储格式
- 每个样本仅占 32 bit ,包含:
- 灯光索引(Light Index) :指向视锥裁剪后的灯光缓冲
- 灯光权重(Light Weight) :PDF 的倒数( )
- 蓄水池以 4×4 像素区域 存储在 Render Target 中,提升缓存一致性
- 1080p 画面只需一个 60×36 像素 的微小 Render Target
PDF 的计算方法
- 从 层次化 MinMax 深度缓冲(Hierarchical MinMax Depth Buffer) 获取大块的深度范围
- 128px 大块使用 MinMax 深度缓冲的 LOD 6 (与大块像素足迹一致)
- 在深度范围之间构造 Tile 中心线段(Central Line Segment)
- 对所有灯光类型使用统一 PDF:计算 全向光(Omni-light)标量照度(Scalar Illuminance) 在线段最近点处的值
PDF 特性 :
- 处处为正 ,不引入采样偏差(Bias-free)
- 计算 快速且低成本
- 假设 Tile 内像素在深度范围内 大致均匀分布 ——对某些场景可能不准确,但实践中足够
- 更精确的 PDF 可以提升蓄水池质量,但目前这个简单 PDF 已经够用
SRS 的具体执行流程
分流策略 :将场景灯光分成 16 条独立的流(Streams) ,每条流对应一个蓄水池槽位。
每条流运行 单样本 A-Chao 加权蓄水池采样(1-sample A-Chao Weighted Reservoir Sampling) 。
迭代过程 :
- 初始化 :每条流从与其槽位索引匹配的场景灯光开始
- 这种初始排序确保前几盏灯被放入特定槽位,优化性能 并 减少少灯场景的噪声
- 后续迭代 :向前跳跃到下一组 16 盏灯,生成 随机偏移(Random Offset) ,用 模 16 运算 偏移流索引
- 随机化目的 :避免高权重灯光在不同大块和帧之间 竞争同一蓄水池槽位
- 重复直到遍历完所有灯光
PRNG 初始化 :为了在 Pixel Shader 实现中确保每个槽位使用相同的随机偏移序列,PRNG 种子设为 大块索引(Big-Tile Index) 。
采样结果
- 每个大块蓄水池包含 16 个唯一、无偏(Unbiased)的灯光候选
- 候选基于其对大块区域的 近似影响力 被概率性地选中
代码流程简述
对大块蓄水池的每个槽位:
使用描述的随机偏移序列遍历场景灯光
对每次迭代:
计算灯光的 PDF
基于 PDF 概率性地选择/替换当前蓄水池灯光(A-Chao WRS)
存储最终灯光索引和权重到蓄水池
效果对比
- 均匀采样(Uniform Sampling) 从 16 个随机灯光中选择 → 噪声严重
- 大块 SRS 采样 从 16 个重要性采样的灯光中重采样 → 噪声显著降低
关键算法与术语总结
分层蓄水池采样(Stratified Reservoir Sampling, SRS)
- 基于 A-Chao 加权蓄水池采样(A-Chao Weighted Reservoir Sampling) 的变体
- 无放回 采样,避免重复
- 将候选灯光分成多条 分层流(Stratified Streams) ,每个蓄水池槽位从独立流中采样
- 流间通过随机偏移 交叉打乱 ,提升多样性
重要性采样 PDF 的层次化设计
- 两阶段从粗到细,在成本与质量之间取得平衡
核心设计哲学
| 设计选择 | 目的 |
|---|---|
| 逐 Tile 采样而非逐像素 | 减少带宽、内存、Wave 发散 |
| 两阶段 SRS | 低成本高质量重要性采样 |
| Pixel Shader 实现 | 适配移动 TBR 架构 |
| fp16 | 利用双倍速率管线 |
| 阴影计算与光照着色器解耦 | 独立优化各阶段 |
| 固定成本随机采样 | 应对 UGC 不可预测的灯光分布 |
小分块重采样阶段(Small-Tile Resampling Stage)
基本流程与目标
- 在大分块(Big-Tile)光源采样完成后,对每个 小分块(Small-Tile) 从大分块储层中 重采样 1~4 个光源 ,用于最终光照计算
- 重采样同样使用 分层储层采样(Stratified Reservoir Sampling, SRS) ,确保小分块储层中 无重复光源
- 关键特性 :重采样步骤的开销 与场景光照复杂度无关 ,因为它仅从 固定大小的大分块储层 中进行采样
- 每个小分块覆盖 256 个像素 ,重采样时根据 小分块中心点位置 选取对应的大分块储层
消除分块伪影(Tiling Artifacts)
问题:规则网格导致的采样相关性
- 若将小分块像素排列为规则的 16×16px 网格 ,会因 采样相关性(Sampling Correlation) 产生明显的 分块伪影
解决方案:交错采样(Interleaved Sampling)
- 将小分块像素与 4 个相邻 Tile 交错分布 ,覆盖更大的 32×32px 区域
- 具体做法:将 64 个 2×2px Quad 分配给 4 个 Tile(分别以红、绿、蓝、黄标识)
- 采样分布使用 高斯-泊松分布(Gaussian-Poisson Distribution) :
- 让更多采样集中在 Tile 中心
- 同时避免同一 Tile 的采样点 彼此紧邻
- 该采样模式在整个渲染图像上 重复铺设
消除大分块边界伪影:随机双线性滤波
- 交错采样解决了小分块伪影,但仍可看到 方形的大分块光照伪影 ——因为大分块储层在小分块中心处做了 点采样(Point Sampling)
- 修复方法:将点采样替换为 随机双线性滤波(Stochastic Bilinear Filtering)
- 在选择大分块储层时,对小分块中心施加 随机偏移(Random Offset)
- 效果:大分块之间的光照过渡 更平滑 ,消除分块边界伪影
- 残留的交错小分块纹理非常适合后续 时空降噪(Spatiotemporal Denoising)
更精细的 PDF 评估
PDF 计算方法
- 小分块重采样使用 更精细的 PDF ,以更好估计光源对该 Tile 的重要性
- 随机 PDF 评估 :从 64 个 Quad 采样点中随机挑选 4 个 ,计算这些点的平均反射亮度:
- 当前假设材质和光源为 单色(Monochromatic) ——即分别计算光照亮度权重和 BRDF,再相乘
- 理想做法 :先计算 RGB 光照 × BRDF 乘积,再做权重——例如 红光照蓝表面 应得到更低的 PDF
- 当前为 性能妥协 ,代价是增加少量噪声
阴影项对噪声的影响
- 若 Tile 完全处于阴影中 或所有 表面法线背向光源 ,则该光源 不被选入 光照评估,从而 降低噪声
BRDF 近似选择
- 初始使用 Lambert BRDF 作为 PDF,后替换为 高光 BRDF(Specular BRDF) 以减少高光噪声
- 最终发现 Lambert + Blinn-Phong 是一个 足够好且更廉价 的近似,可有效降低最终 Lambert + GGX BRDF 的噪声
- 目前仅支持 一种光照 BRDF ,未来考虑为 多种 BRDF 分别实现不同的 PDF 近似以优化噪声
性能优化:减少 ALU 和 VGPR 压力
- 先在 Tile 采样点上对 亮度效率加权的材质参数取平均 ,再统一用于反射亮度计算
- 减少了 ALU 使用量和 VGPR 寄存器压力
偏差(Bias)问题与缓解
- 理想条件 :PDF 在 Tile 反射亮度非零的任何位置都应 非零 ,以保持 无偏(Unbiased)
- 实际问题 :4 个 PDF 采样点可能全部落在阴影中,而 Tile 内其他像素实际被照亮
- 导致 有偏的光照边缘噪声 ,在 TAA 后表现为轻微的 暗化
- 在简单光照区域最为明显
- 缓解方法 :在阴影余弦项乘入 PDF 之前,添加一个 小偏移量(Small Offset)
- 降噪后偏差基本 不可察觉
SRS 流分割策略(与大分块一致)
- 对于含 个光源样本的小分块储层,将大分块的 16 个候选样本 拆分为 个 独立流(Independent Streams)
- 重采样开销 与 无关 ——仅受 大分块储层大小 和 小分块 PDF 计算成本 影响
- 具体流程(以 为例):
- 从大分块储层取前 4 个样本分配到各流
- 下一批 4 个样本通过 随机偏移洗牌(Shuffle with Random Offset) 分配到各流——减少高重要性光源在相邻小分块间 竞争同一储层槽位 的概率
- 重复直到 16 个大分块样本全部处理完毕
- 最终得到 4 个唯一的高质量光源样本
储层导出
- 小分块储层通过像素着色器输出到 1~4 通道 Render Target ,使用与大分块相同的 32bit 格式
- 理论上可存更多样本,但出于 性能 和 单 Render Target 容量 限制,上限为 4
- 1080p 分辨率下需要 120×68px 的 Render Target,占用 32KB~128KB 内存
代码逻辑概要
for each slot in small-tile reservoir:
iterate through big-tile reservoir samples for this slot
for each sample:
evaluate light PDF
calculate resampling PDF (unbias big-tile sampling bias)
probabilistically pick the light
store winning light and its weight to reservoir
延迟阴影评估阶段(Deferred Shadow Pass)
核心设计理念
- 阴影评估在 独立的像素着色器 Pass 中完成,与最终光照评估 解耦
- 这样可以在 更低分辨率 下评估阴影以提升性能
每 Quad 一次阴影评估
- 每个 2×2px 小分块 Quad 仅评估 一次 阴影,而非逐像素评估
- 好处 :
- 阴影评估量降低到 1/4
- 简化光照着色器
- 减少 Wave 发散(Wave Divergence) 、数据访问和 VGPR 压力
- 光源类型特定的阴影采样被 隔离在单独着色器中
内存布局
- 阴影项以 8×8 像素块 存储,对应一个小分块的 64 个 Quad 采样
- 该组织方式利用了 GPU 像素着色打包到 Wave 的方式,减少发散
- 使用 8bit 阴影项 + 1bit 时序噪声(Temporal Noise) 消除 TAA 下的色带(Banding)
- 1080p 下内存占用 0.5MB~2MB
技术解耦的优势
- 阴影评估可替换为不同技术(如 Shadow Map 或 光线追踪 ),而 不影响最终光照着色器性能
阴影贴图(Shadow Map)实现
阴影图集(Shadow Atlas)
- 当前使用 持久化、动态管理的 16bpp 阴影图集
- 图集同时包含 聚光灯(Spot) 和 全向灯(Omni) 的阴影贴图,均为 方形、2 的幂次大小
- 根据 光源到摄像机的距离 动态调整阴影贴图分辨率,平衡质量与图集空间
渲染流程
| 光源类型 | 渲染方式 | 拷贝时的额外处理 |
|---|---|---|
| 聚光灯 | 从光源视角渲染常规深度缓冲 | 深度线性化 + 偏移(Bias) |
| 全向灯 | 渲染立方体贴图到深度缓冲 | 立方体面映射到 八面体空间(Octahedral Space) + 深度线性化 + 偏移 |
- 两种类型拷贝时都添加 2px 边框 以支持 PCF 滤波
静态与动态阴影贴图
| 类型 | 更新频率 | 包含几何 | 用途 |
|---|---|---|---|
| 静态(Static) | 仅在光源变换或阴影分辨率变化时更新 | 仅静态几何 | 装饰性光照 |
| 动态(Dynamic) | 每帧持续更新(更昂贵) | 静态 + 动态几何 | 通用光照 |
负载均衡
- 使用 优先级队列系统(Priority Queue) 将阴影贴图更新 分摊到多帧 ,避免多张阴影贴图同时更新导致的 帧率尖峰
阴影滤波
- 使用 4-tap "硬件" PCF 配合 随机 PCF(Stochastic PCF) ,产生更柔和、自然的阴影
- 每次阴影项评估仅需 1 次 Gather 操作
- 同时在此阶段应用 IES 光源配置文件(IES Light Profile) 和 聚光灯角度衰减(Angular Spot Falloff)
- IES 配置文件也在小分块 PDF 评估中使用,以 降低噪声
未来改进计划
- PCSS(Percentage Closer Soft Shadows) ——接触硬化阴影
- 屏幕空间光线步进细节阴影(Screen-Space Ray-Marched Detail Shadows)
- 光线追踪阴影(Ray-Traced Shadows) ——可在高端设备上启用
每 Quad 共享阴影的局限性
- 在 物体轮廓(Silhouettes) 处,同一 Quad 内的像素可能需要 截然不同的阴影值 ,共享会引入伪影
- 缓解 :随机化 Tile 采样 + TAA 在大多数情况下能消除此问题
- 仍可能引入 轻微的光照边缘偏差 ,但伪影很小
- 如有必要,可 回退到全分辨率阴影评估 ,以质量换性能
光照评估阶段(Lighting Evaluation Stage)
像素到小分块的映射
- 首先获取当前像素对应的 小分块光源样本 和 阴影项
- 由于整个算法在 像素着色器 中运行,需要从屏幕像素 反向映射 到小分块和采样索引
- 使用 16×16px 反查表(Inverse LUT) :将屏幕空间 Quad 坐标映射到 交错 Tile 索引和样本索引
- 注:若使用 Compute Shader 则无需反向映射,可直接评估 Tile 像素的光源样本,通过 散射写入(Scattered Writes) 写入光照缓冲
光照累积
- 对每个光源样本,累积 Lambert + GGX BRDF 贡献:
其中:
-
= 样本权重(Sample Weight)
-
= 阴影项(Shadow Term)
-
= Lambert + GGX BRDF
-
结果写入 光照缓冲(Lighting Buffer)
核心性能特性
| 特性 | 说明 |
|---|---|
| 固定开销 | 每 Tile 存储固定 1~4 个光源样本,开销与场景光照复杂度 无关 |
| 低发散 | 因阴影评估已解耦,光照评估在所有光源类型间 高度统一 ,减少像素着色器发散 |
| 进一步优化 | 使用 Compute Shader 可将 Tile 像素连贯打包到 Wave 中,进一步降低发散 |
降噪策略与 TAA 挑战
目标:用 TAA 代替独立降噪
- 为 降低带宽开销 ,计划改进 时间抗锯齿(TAA) 使其兼任降噪器,避免额外的降噪 Pass
核心难点:邻域颜色钳制(Neighborhood Color Clamping)
- 标准 TAA 使用 3×3 像素邻域 的历史颜色钳制来抑制 鬼影(Ghosting)
- 在随机光照输入下,某帧的像素邻域可能 没有渲染到关键光源 ,导致颜色范围受限
- 表现为 闪烁的光照斑块(Flashing Lighting Splotches)
可能的解决方向
- 使颜色钳制 更兼容噪声输入
- 寻找 替代的鬼影抑制技术
- 提供 更适合 TAA 的输入数据
- 以上方法的 组合
这仍是 HypeHype 团队 活跃的研发方向
视觉结果与性能分析
采样率对视觉质量的影响
每像素采样数(SPP)对比
- 1 SPP :噪声更多(符合预期),但经过 TAA 后仍可收敛到可接受的结果
- 4 SPP :能够还原更多 精细光照细节 ,如复杂几何体上的 锐利高光反射
- 两者经 TAA 后视觉差异 不大 ,均可达到可接受质量
大分块储层大小对光照的影响
- 减小大分块样本数 → 场景变暗,尤其是 远处区域
- 变暗原因:为抑制 萤火虫噪点(Fireflies) 而对光源权重做了 截断(Capping) ,引入了 光照偏差(Lighting Bias)
- 增大大分块储层 → 噪声降低,光照细节改善
- 原因:小分块重采样可从 更丰富的候选集 中抽取更相关的光源样本
性能测试平台
| 硬件 | 定位 | 性能对标 | 功耗 |
|---|---|---|---|
| Adreno 610 | $99 低端安卓手机 | ≈ Xbox 360 / PS3(ALU + 带宽) | 3W |
| Adreno 830 | $1000 高端安卓手机 | ≈ 10 年前的主机/桌面 GPU | 5W |
| RTX 4070 Laptop | 高端笔记本 | — | — |
- 弱设备使用 更低的渲染分辨率
性能分析结果
无局部光源场景(Sun-Only vs STB 对比)
- 视觉上 STB 光照与纯太阳光照 几乎一致
- 唯一区别:STB 以 2×2px Quad 为单位评估阴影,阴影略微 柔和
- 测量范围仅包含 直接光照 (不含 IBL、SSAO 等)
| 平台 | STB 1 SPP 额外开销 |
|---|---|
| Adreno 610 | +0.66 ms |
| Adreno 830 | ~+0.35 ms |
| RTX 4070 Laptop | ~+0.35 ms |
- Adreno 610 上仅多 0.66ms 即可支持 任意局部光源 ,非常经济
- 高端平台相对开销比例较高,可通过 Compute Shader 实现和 Pass 合并 进一步缩小差距
50 个局部光源场景(SPP 缩放测试)
- 纯太阳光照(此场景实际为微弱月光)本身也有一定开销
| 平台 | 1 SPP 额外开销 | 4 SPP 开销 |
|---|---|---|
| Adreno 610 | +1.5 ms | 较昂贵 |
| Adreno 830 | ~+0.5 ms | 合理 |
| RTX 4070 | ~+0.5 ms | 合理 |
- 关键观察 :Small-Tile SRS Pass 在有局部光源时比无光源场景 贵 3 倍 (低端手机上),因为需从 完整大分块储层 中重采样
- 简易优化:缩小大分块储层 ,以少量噪声换取性能
- Big-Tile SRS Pass 开销始终极小:即使 500 个光源 ,在所有平台上仅需 0.02 ms
- 若光源数量进一步增大,可切换为 均匀采样(Uniform Sampling) 以固定开销
结论
- 提出了一种新的 随机光照算法 ,将光源采样从 逐像素 提升到 逐分块(Per-Tile) 级别
- 核心收益 :
- 大幅降低带宽消耗和分支发散
- 使 完全动态的复杂光照 成为 低端移动设备 上的可行方案
- 算法仍在 持续开发中 ,但质量和性能的初步结果 令人鼓舞
未来工作
Compute Shader 优化
- 为当前的 Pixel Shader Pass 实现 Compute Shader 变体 ,并在不同设备上做 profile
- Compute Shader 有更多 ALU 和带宽优化空间 ,可能同样惠及移动设备
- 可将最后三个 Pass( 小分块重采样 + 阴影 + 光照 )合并为 单个 Pass
- 在 PC / 主机上应有 显著性能提升 ,部分移动设备也可能受益
TAA 降噪改进
- 光照开销保持固定,但 照亮区域的光源越多,噪声越大
- 最大挑战 :让 TAA 能很好处理光照算法输出的 噪声图像
- 目标:通过 改良 TAA 完成降噪,避免引入额外的 时空降噪 Pass
- 另一可能方向:类似 ReSTIR 的 前帧小分块储层重采样 ,利用时域信息降噪(需进一步研发)
大分块 PDF 质量改进
- 当前问题 :大分块 PDF 使用 Tile 深度范围的 中心线段 估算光源影响
- 若深度范围大且像素集中在远近端,中间深度的光源被 过度采样 ,增加噪声
- 改进方向 :根据 各深度处的像素密度 加权 PDF,使大分块储层样本更高质量
- 另一改进:若 聚光灯锥体不与大分块视锥相交 ,直接将 PDF 设为 0
- 大分块采样目前非常高效,有余量花更多 计算周期 提升样本质量以应对更广泛场景
小分块 PDF 质量与性能改进
- 当前随机 PDF 评估需要 4 次带阴影的辐照度 + BRDF 评估 ——开销较大且在 光照边界 处引入偏差
- 可能的优化:
- 使用 Tile 包围盒 + 层级阴影贴图(Hierarchical Shadow Map) 做 单次保守阴影评估
- 生成 低分辨率 G-Buffer 做 单次保守 BRDF 评估
- 当前 PDF 未使用 色调映射(Tone Mapping) ,加入后应可进一步 降低噪声
参数调优
- 现有算法参数(大分块储层大小、大分块像素尺寸、采样模式等)均有 进一步调优空间 ,可能带来质量和性能的 低成本提升
半透明与体积光照支持
- 当前仅支持 G-Buffer 中的完全不透明表面
- 半透明光栅化表面 :需将光源采样和储层扩展到 体积(Volumes) ,在光栅化期间高效采样
- 体积光照(Volumetric Lighting) :可在 体积光线步进(Volumetric Ray Marching) 过程中执行小分块重采样来实现