(论文)[2025-EG] Many-Light Rendering Using ReSTIR-Sampled Shadow Maps

Many-Light Rendering Using ReSTIR-Sampled SM

  • Song Zhang,Daqi Lin,Chris Wyman,Cem Yuksel
    • 【1,4】University of Utah, USA
    • 【2,3】NVIDIA, USA
  • 项目主页代码
    • 主页上效果图对比明显
  • 主要思路【不需要硬件光追支持,光栅化场景】
    • pass1:ReSTIR 挑选出重要的光源【此时可见性渲染使用 ISM】
      • 【全渲染 SM 开销太高】
      • 挑选出来之后这些光源渲染 SM,剩余光源渲染低质量 ISM【只需要 1 个 pass】
    • pass2:ReSTIR 渲染,可见性判断使用 SM + ISM
    • 为了加速,当前帧的重要光源使用上一帧挑选得到的

Introduction

  • 贡献
    • 光栅化条件下利用 ReSTIR 做阴影渲染
    • 使用 ReSTIR 自动挑选重要光源
    • 减少 flicker【闪】
  • 光源限制:我们的可见性测试是基于 SM,因此光源需要是 SM 友好的
    • points、spotlights
    • PCF、PCSS 估计的面光源

相关工作

  • SM
    • shadow map
    • instant radiosity【拆分为点光源】
    • imperfect shadow maps【估计点光源的可见性】
    • light cuts【聚合周围光源共享】
    • importance sampling
    • tiled shading【每个 tile 只考虑部分光源】
    • BVHs / Grids:减小找到重要光源的代价
      • stochastic light cut
  • 两种方式:显式求和、随机采样
  • ReSTIR

\[ \langle F \rangle_{mc} = \frac{1}{N} \sum_{i=1}^{N} \frac{f(x_i)}{p(x_i)} \quad\xrightarrow{RIS}\quad \langle F \rangle_{ris} = \frac{1}{N} \sum_{i=1}^{N} \frac{f(x_i)}{\hat{p}(x_i)} \frac{1}{M_i} \sum_{j=1}^{M_i} \frac{\hat{p}(x_{ij})}{p(x_{ij})} \]

  • DI 计算 RIS 权重的时候可以省略可见性测试【最终贡献需要可见性测试】
    • \(\hat{p}\)(unnormalized target distribution)里面不考虑可见性,或者说有的考虑有的不考虑(at low frequency)
    • 即使这样,也有明显的方差降低
  • Imperfect Shadow Maps:1 pass 生成大量低质量的 shadow maps(~100)
    • 常用于:间接光、不准确的可见性测试
  • 本文将其用于 ReSTIR based 的直接光可见性测试

ReSTIR-Sampled SM

  • 一帧只能对少量光源做 SM
  • 不同光源的重要程度不一样,依赖于视点
  • key:对重要光源生成 SM,其他光源使用 ISM
    • 使用 ReSTIR 挑选重要光源
    • 另外 ReSTIR pass 用于着色

选取重要光源

  • 选择 top-N
  • 只是根据光源在底片上的 sensor importance 不行
    • 光源只影响一个像素,但是边缘变化剧烈
  • 定义光源 \(l_j\) 的重要性 \(S_j\)
    • \(f_i(l_k)\) 表示光源 \(l_k\) 在像素 \(i\) 的 DI 贡献

\[ S_j=\sum_{i=1}^{\text{pixels}}\left(f_i(l_j)\Big/\sum_{k=1}^{\text{lights}}f_i(l_k)\right) \]

  • 直接计算 \(f\) 不现实:逐像素、逐光源
  • 考虑这样一件事:每个像素按照 \(f\) 权重选择光源,那么 \(S_j\) 和期望相同
  • 于是我们在每个像素走 ReSTIR 采样流程,然后统计不同光源数量;根据数量挑选 top-N
    • 其中可见性测试使用 ISM 完成【这是一个近似,但是实验结果表明挑选出来的 top-N 和用 SM 可见性测试结果差不多】

  • 称为 ranking ReSTIR pass

着色

  • 对所有光源着色开销依然很大,因此引入 shading ReSTIR pass
  • 此时可见性测试使用 SM(挑选出来的 top-N) + ISM(其他光源)
  • 减小等待开销:当前帧的 top-N 使用上一帧的结果

  • 初始 light samples 只生成一次,同时被用于 shading/ranking ReSTIR pass
  • 需要可见性测试的时候,执行两次可见性测试(如果有 SM 的话)
  • 样本复用的时候,各自选择自己的复用样本【可以使用相同随机数,这表示会选择到相同的样本,可以有更多复用

时间稳定性

  • 合并成一个 ReSTIR pass 会导致闪烁【当前帧 shading 影响下一帧 ranking】
  • 解决闪烁问题:SM 只在 final shading 使用,其余时间使用 ISM
    • 这样的话合并成一个 pass 效果不好【两次可见性测试可能不一致】
  • 还是有可能闪烁:某一个光源反复升降级【top-N 边缘】
  • 基于方差的挑选,打分【出发点:如果一个光源很可能马上降级,那么不对他升级】
    • \(\mu_{\ast},\sigma^2_{\ast}\):上一帧统计量
    • \(\alpha=0.1\)

\[ \begin{array}{c} \mu=(1-\alpha)\mu_{\ast}+\alpha s\\ \sigma^2=(1-\alpha)\sigma^2_{\ast}+\alpha(s-\mu_{\ast})(s-\mu)\\ \end{array} \]

  • 升级和降级的光源构成 pair:如果他们的 \(\sigma^2\) 差距没有到达另外一个 \(\sigma^2\)\(\beta\) 倍,则拒绝此次改变
    • 测试结果:\(\beta=3.0\)
    • 如果变化不是偶然的,才允许变化

结果

  • 实现:Falcor
    • RTX 4090 24GB
  • 光源数量:hundreds(spot / point)
  • 所有阴影都是逐帧生成,支持动态【论文中都假设动态实现】
  • ReSTIR DI:\(M=32,R=30\)
  • 1024x1024 shadow maps,32x32 ISMs
    • PCF 进行 AA
  • top-N 的 N 怎么给定:根据场景人工给定

实验

  • top-N 不同的 N
  • 剩余可见性使用 ISM 也很重要
    • 对比实验
      • ranking 的时候都用 ISM
      • shading的时候 top-N 使用 SM,剩余光源使用不同策略
    • 使用 ISM、都认为可见、都认为不可见
  • ranking 的时候使用 ISM 就够了
    • 对比实验:不测试、使用所有 SM、Ours
  • 不同光源强度下,我们的表现
    • 强度大了,我们比 ISM 好得多

  • 时间稳定性
  • 使用不同方式挑选 top-N
    • Distance Heuristic【距离相机最近的几个光源渲染 SM】、ReSTIR ranking
  • ReSTIR 带来的噪声能够通过 SVGF 降噪

总结

  • future
    • 如果所有光源都很重要怎么办?帧间复用 SM
    • 提高 ISM 的质量
    • 其他应用:屏幕空间光追