(论文)[2023-SIG-Course] A Gentle Introduction to ReSTIR: Path Reuse in Real-time (2)

ReSTIR

  • 主页
  • update:March 4, 2024

04-ReSTIR

Weighted Reservoir Sampling

  • Weighted reservoir sampling (WRS),一个系列
    • sampling one (or more) elements from a (weighted) stream of samples in a single pass over the data without storing it
  • Reservoir Resampling
image-20240926154717126
  • 蓄水池重采样得到的结果,恰好是满足正比于 \(w_i\)
  • 证明
    • \(s_k=\sum_{i=1}^{k}w_i\),于是有 \(s_k=s_{k-1}+w_k\)
    • \(k\) 个样本被采样的概率如下
      • \(k\) 次被选中,而且之后都没有被更新

\[ \begin{aligned} \Pr(Y=X_k) =&\dfrac{w_k}{s_k}\cdot\prod_{i=k+1}^{M}\left(1-\dfrac{w_{i}}{s_{i}}\right)\\ =&\dfrac{w_k}{s_k}\cdot\prod_{i=k+1}^{M}\left(\dfrac{s_i-w_{i}}{s_{i}}\right)\\ =&\dfrac{w_k}{s_k}\cdot\prod_{i=k+1}^{M}\left(\dfrac{s_{i-1}}{s_{i}}\right)\\ =&\dfrac{w_k}{s_M}=\dfrac{w_k}{\sum_{i=1}^{M}w_i} \end{aligned} \]

Spatiotemporal reuse

  • 每个像素我们只能保存 \(M\) 个样本,只用这 \(M\) 个样本限制了采样的质量

Initial candidates

  • \(M\) 个样本中 RIS 采样得到一个样本

Spatial reuse

  • 一个像素周围的样本比较接近,可以复用
  • 找到 spatial neighbors,然后继续 RIS
    • spatial neighbors:picked randomly from a disk
  • RIS 的过程可以多次进行,但是代价就是相关性会增加
  • 样本的采样分布差别大,需要使用高级的 MIS(例如 generalized balance heuristic)
  • Do not choose which spatial neighbors to reuse based on the random samples stored at these neighbors, as this causes bias!(这是为什么?

Temporal reuse

  • 相邻帧比较相似,可以复用
    • 通过 motion vectors 重投影
  • 也需要高级的 MIS
  • access to previous frames’ target functions is required to remove all bias.

例子:ReSTIR DI

  • ReSTIR for direct illumination
  • 直接光照:3 个顶点的路径(只反弹一次)
    • 相机 \(\to\) 光源:\(\bar{x}=[\mathrm{x}_0,\mathrm{x}_1,\mathrm{x}_2]\)

  • \(x_2\in A\)\(A\):光源表面的点的集合
  • 选定 \(\mathrm{x}_0,\mathrm{x}_1\),任务转化为如下

\[ L(\mathrm{x}_1\to \mathrm{x}_0)=\int_Af_s(\mathrm{x}_2\to \mathrm{x}_1\to \mathrm{x}_0)G(\mathrm{x}_1\leftrightarrow \mathrm{x}_2)V(\mathrm{x}_1\leftrightarrow \mathrm{x}_2)L_e(\mathrm{x}_2\to \mathrm{x}_1)\;\mathrm{d}\mathrm{x}_2 \]

  • 反正就是一个 \(\mathrm{x}_2\) 的函数
    • pixel dependent \(f_i\):像素变了,\(\mathrm{x}_1,\mathrm{x}_2\) 就会变了

\[ L(x_1\to x_0)=\int_Af(\mathrm{x}_2)\;\mathrm{d}\mathrm{x}_2 \]

  • ReSTIR:不同像素间共享 \(\mathrm{x}_2\)
    • we resample \(\mathrm{x}_2\) from one or morei ndependent canonical samples covering the current pixel(保证无偏), plus samples borrowed from other pixels and frames(复用).

Target function

  • \(x\) 代替 \(\mathrm{x}_2\)\(f\) 如下

\[ f(x)=f_{s}(x)G(x)V(x)L_{e}(x) \]

  • target \(\hat{p}=f\)

\[ \hat{p}(x)=f_{s}(x)G(x)V(x)L_{e}(x) \]

  • 早期论文近似:去掉 \(V\) 项,方便计算,但是需要特殊处理保证正确性

\[ \hat{p}(x)=f_{s}(x)G(x)L_{e}(x) \]

Initial candidates

  • 为每个像素生成 canonical samples
    • 对于 DI,可以在光源表面采样 \(M\) 个点,然后 RIS
  • 复用的时候,使用 generalized balance heuristic MIS weight
    • \(i\):第 \(i\) 个像素

\[ m_i(x)=\frac{\hat{p}_i(x)}{\sum_{j=1}^M\hat{p}_j(x)} \]

Spatial reuse

  • 找到相似的像素,复用它的样本
    • 启发式:GBuffer 中观察相似性
      • 不能基于样本本身,bias
  • MIS 权重:\(1/M\) 会导致 bias
    • 解决方案 sec7:contribution MIS weights
    • 或者 generalized balance heuristic?

Temporal reuse

  • motion vector 找到上一帧的样本,复用
  • 计算 mis 需要使用到上一帧的 \(\hat{p}\),因此需要求可见性(需要保留上一帧的加速结构)

History length

  • 如果时间复用,上一帧和现在赋相同的权重,那么会丢失 ~50% 的历史信息
  • 引入 confidence weights \(c_j\)

\[ m_i(x)=\frac{c_i\hat{p}_i(x)}{\sum_{j=1}^Mc_j\hat{p}_j(x)} \]

  • 越信任这个样本,\(c_i\) 越高
  • effective sample count:corresponding to \(N\) samples
    • 很难,因为 RIS 的样本来自不同分布,有效的数量难计算
    • 可以简单的使用这个样本集成的样本数来表示(直接加起来)
      • 相当于给出了一个上界
      • 更有效的估计很难
  • 实际上会将这个值 cap 到 <5~30(20 是个不错的选择)
    • 否则会导致 \(c_i\) 指数增长,导致新样本权重太小了
  • 算法如下

  • 新样本:\(c_i=1\)
  • 新进入屏幕的像素(没有 temporal precedessor),\(M=0\)
  • 检测到 occlusions or disocclusions,\(M=0\)
  • reset \(M=0\) 通过检测 GBuffer
    • 不能基于样本本身,bias

Advanced topics

  • light sampler 对于 glossy 的不友好
    • BSDF lobe 小
  • Improved light sampling
    • 光源采样的时候:power-based importance sampling
      • power:total emitted flux over the surface
      • power 采光源,面积均匀采点
    • “light tiles”(sec7
    • 不考虑着色点信息
  • Mixing BSDF and light sampling
    • initial candidate:容易实现,常规 MIS
    • 恰当地处理:shift mappings(sec5
  • RIS and domains
    • 物体移动的话,采样空间变了;原始 RIS 不能处理
    • shift mappings(sec5

05-Reusing Between Domains

  • Simply reusing vertices without modification does not allow reuse through mirrors or glass.
    • 反射定律会被违反
  • shift mappings

Preliminaries

  • 不同的 domains 之间的样本复用
    • 例如 path spaces seen by different pixels

Shift mappings

  • shift mapping:最早是在 Gradient-Domain MLT 中提出,用于像素间的复用
  • 路径变换 \(A\to B\)\(y=T(x)\)
  • reconnection shift
    • \(\mathrm{x}_2\) 之后的路径不变,开头直接和 \(\mathrm{x}_2\) 相连
    • diffuse and rough surfaces 效果不错,但是 glossy or specular surfaces 不行(连接的光路不成立)

\[ T_{i\to j}([{\color{red}\mathrm{x}_{i,0},\mathrm{x}_{i,1}},\mathrm{x}_{2},\mathrm{x}_{3},\cdots]) =[{\color{red}\mathrm{x}_{j,0},\mathrm{x}_{j,1}},\mathrm{x}_{2},\mathrm{x}_{3},\cdots] \]

  • 其他:half-vector shift、random replay shift

  • 定义:Lin et al. (2022)

    • 子集的双射

    • a shift mapping \(T\) from \(A\) to \(B\) is a bijective function from a subset \(\mathcal{D}(T)\subset A\) to its image \(\mathcal{F}(T)\subset B\)

    • undefined shifts 也要满足双射:如果 \(x\) 不能被 \(T\) 变换成 \(y\),那么不能存在 \(y\) 能逆变换回 \(x\)

  • 实现上,在 \(T_{i\to j}\) 的过程中可能会设置 停止条件,返回 undefined

Jacobian determinants

  • 多变量的话称作 Jacobian matrix
  • pdf 的变化
    • \(W_Y=\dfrac{1}{p_Y(Y)}\)
    • \(Y=T(X)\) 则有

\[ p_Y(Y)=\frac{p_X(X)}{\vert T'(X)\vert},\quad W_Y={\vert T'(X)\vert}W_X \]

Reusing samples between domains

  • 和原来的区别,采样的时候可以在 \(\Omega_i\) 上进行,复用的时候变换到 target domain \(\Omega\)
    • shift failed:\(w_i=0\)
    • \(W_{X_i}\):定义在 \(\Omega_i\) 上的
      • \(W_{Y_i}={\vert T_i'(X_i)\vert}W_{X_i}\)

  • 为了保证覆盖整个 \(\Omega\):加入 canonical sample,使用 \(\hat{p}\) 采样(\(\Omega_i=\Omega\)
    • \(T_i(x)=x,\vert{T_i'(x)}\vert=1\)
  • 算法流程

MIS between domains

  • 如果我们知道 \(X_i\) 生成的 \(\Omega_i\) 上的 pdf
    • \(y\in\Omega\)\(p_{Y_i}\)\(p_i\) 映射到 \(\Omega\) 上的 pdf

\[ m_{i}(y)=\frac{p_{Y_{i}}(y)}{\sum_{j=1}^{M}p_{Y_{j}}(y)} \]

  • 根据
    • \(y=T(x)\)
    • 变换规则:\(p_Y(y)=\dfrac{p_X(x)}{\vert T'(x)\vert}\)
    • 双射

\[ p_{Y_i}(y)=p_{X_i}\left(T_i^{-1}(y)\right) \left|T_i^{-1'}(y)\right| \]

  • 无法映射,则 \(p_{Y_i}(y)=0\)
    • 这一点允许我们使用 \(\hat{p}\) 作为代理(不需要特殊计算值)
    • 相当于都转化到 \(\Omega\) 上,然后使用 generalized balance heuristic

\[ \hat{p}_{\leftarrow i}(y)= \left\{ \begin{array}{ll}\hat{p}_i\left(T_i^{-1}(y)\right)\left|T_i^{-1\prime}(y)\right|,&\text{if}\;y\in T_i(\text{supp}\;X_i)\\ 0&\text{otherwise} \end{array} \right. \]

  • generalized balance heuristic

\[ m_i(y)=\frac{\hat{p}_{\leftarrow i}(y)}{\sum_{j=1}^M\hat{p}_{\leftarrow j}(y)} \]

  • weighted 版本

\[ m_i(y)=\frac{c_i\hat{p}_{\leftarrow i}(y)}{\sum_{j=1}^Mc_j\hat{p}_{\leftarrow j}(y)} \]

  • 要求

\[ \mathop{\sum_{i=1}^M}_{y\in T_i(\operatorname{supp}X_i)}m_i(y)=1 \]

  • 这样 MIS 的计算量还是太大了:\(O(M^2)\)
    • 之后有优化( sec7