蒙特卡洛应用:RTX 光线追踪算法 ReSTIR 原理

  • 接上文:蒙特卡洛方法
  • 相关论文:《Spatiotemporal reservoir resampling for real-time ray tracing with dynamic direct lighting: 2020》

ReSTIR 算法全称为 GIalgorithm based on Spatiotemporal Reservoir Resampling,是一种在实时路径追踪渲染算法,用于提高间接光照的采样率,来达到降低路径追踪噪点的目的,它非常适用于计算 GI,目前 UE5.4 的 Lumen 就已实现了基于 ReSTIR 的 Gather……

同时,它也是目前 NVIDIA RTX 应用的最新光线追踪算法之一,未来可期

在阅读这一章之前,请确保你已经完全理解了蒙特卡洛方法中的所有内容

四、蒙特卡洛与 ReSTIR

4.1 重采样重要性采样(RIS) —— 蒙特卡洛积分求解器

ReSTIR,我们先从其中的 "IR" 开始介绍

将前面 3.4 节的 SIR 方法真正用于重要性采样,即作为采样分布映射获得服从目标 PDF 分布的样本,这种重要性采样就被称为 RIS —— 重采样重要性采样(Resampled Importance Sampling)。RIS 也是首次把重采样引入渲染的开山之作

RIS 的思路也很明确:使用 SIR 的方式获得 n 个样本,并将这 n 个样本代入蒙特卡洛积分方程 (x)=\int_{\Omega} f(x) d x\approx\frac{1}{n} \sum_{i=1}^{n} \frac{f\left(x_{i}\right)}{p\left(x_{i}\right)} 进行求解

代入之后是什么样的呢?这里我们回到前面 SIR 的部分:

  1. 我们目标是从概率密度函数为 g(x) 的分布中进行采样,g(x) 为 Target PDF
  2. 从一个非常简单的 PDF:p(x) 中取出了 m 个样本,记为 X=x_1, x_2, \cdots, x_m
  3. 而通过 SIR 方法进一步获得的样本 Y 中 有 n 个样本,分别为 _1, \cdots, y_n

那么最终的蒙特卡洛积分结果就应如下

\int_{\Omega} f(x) d x\approx I_{R I S}^{n, m}=\frac{1}{n} \sum_{i=1}^n \frac{f\left(y_i\right)}{g\left(y_i\right)}

而 y_1, \cdots, y_n 服从的,应该是 SIR PDFp^{\prime}(z)=\frac{g\left(x_z\right)}{\frac{1}{m} \sum_{i=1}^m w\left(x_i\right)}:因此可以将 SIR PDF 作为重要性采样的 PDF,即

I_{R I S}^{n, m}=\frac{1}{n} \sum_{i=1}^n \frac{f\left(y_i\right)}{p^{\prime}\left(y_i\right)}= \frac{1}{n} \sum_{i=1}^n\left(\frac{f\left(y_i\right)}{g\left(y_i\right)} \cdot\left(\frac{1}{m} \sum_{j=1}^m w\left(x_{ j}\right)\right)\right)

到此,我们就得到了一个简易版本的蒙特卡洛积分求解器


事实上,对于上面的蒙特卡洛积分求解器其实是一个弱化版的求解器。可以发现,我们在执行 SIR 步骤的时候:Y 样本中每一个 y_i,其实都是从同一个 X 样本中选取的

理论上,可以对要选取的每一个 y_i,都重新生成一份 X 样本,并且每次生成的 X 样本的总数量,也不再是固定的 m,而是不同的 m_i,这样做的一个好处就是:更不容易出现相同的两个样本 y_{i1}, y_{i2},且最终方差也可能会更小,此时I_{R I S}^{n, m}=\frac{1}{n} \sum_{i=1}^n \frac{f\left(y_i\right)}{p^{\prime}\left(y_i\right)}= \frac{1}{n} \sum_{i=1}^n\left(\frac{f\left(y_i\right)}{g\left(y_i\right)} \cdot\left(\frac{1}{m_i} \sum_{j=1}^{m_i} w\left(x_{i j}\right)\right)\right),其中 w\left(x_{i j}\right) 就是指当获得 n 个最终样本的第 i 个样本时,SIR 流程中确定的 m 个样本组成的 X 中的第 j 个元素的权重

4.2 蓄水池采样(RS, Reservoir Sampling)

接下来就是介绍 ReSTIR,其中的 "Re"

在介绍蓄水池采样算法前:再举一个完全不需要复杂的数学推导,生活中的例子

        在一个军训基地里,开学的第一天上午,来了 N = 2087 名来军训的学生,现在你作为教官,要从中选出 K = 100 名作为最终主方队的队员,并且由于你在鹅城当过县长,所以你主打的就是一个公平……,思来想去,你最终采用了最质朴的抽签的方式,即让这 2087 名学生依次抽签,抽中“幸运签”的学生被选中作为最终主方队的队员

但是紧接着问题就来了,这2087名学生并非全部要来这个军训基地里训练的学生,甚至连一半不到,这可不,第一天下午2点,又来了387名学生,下午4点,又来了566名学生……甚至第二天上午,还在源源不断的来新生

        第二天上午的你,发现这个问题变得棘手了起来,到现在为止,学生总数 N = 3040,可是你昨天就已经从前2087名学生中选出了100名队员,事实上,你应该在确保不会再有新学生进来之后再抽取,现在你要保证公平只能有一种方案了:即前面兴师动众,让2000名学生同时抽签的结果直接废弃,等到后面不会再有新生了之后,再统一举办一次更浩大的“抽签仪式“

        可是,真的只有这一种方案了嘛,确定要重新抽签嘛?前面的努力白费不说,后面再举行一次更浩大的全员抽签是否过于浪费场地和时间?


其实,以上的问题用数学描述的话,一句话就可以概括:从 n 个数据的池子中,等概率抽选 m 个样本,但是,n 的大小是动态的,可能后面会非常大且不可预知。请问你如何确保在 n 每次扩容后,都能从当前的数据池中等概率选出 m 个样本,要求总复杂度 O(n)

此题的一个非常完美的方案,即是:蓄水池采样(Reservoir Sampling),它的流程如下(总样本数量 n 未知,你要等概率抽取 m 个样本)

  1. 遍历所有的 n 个数据,对于前 m 个数据,无脑全部加入“蓄水池”,此时蓄水池已满
  2. 从第 m+1 个数据开始,如果当前遍历到样本池中的第 i 个数据,则在 [1, i] 范围生成一个随机整数 p,如果 p \leq m,则将该数据与蓄水池中的第 p 个数据替换,否则该数据丢弃
  3. 重复步骤②,直到遍历完所有的 n 个数据,如果 n 此时扩容,则继续执行步骤②……

这个算法即可确保在任意时刻处理完前 k 个数据后,蓄水池中的 m 个数据都是以 \frac{m}{k} 的概率获得的

到此,如果你是前面题目中的教官,在了解了这个蓄水池采样算法后,大可不必放弃之前的抽样结果,更不需要在人全部到齐后再进行一次完全抽样,只需要对剩下新来的学生进行如上步骤②的操作即可:即假设当前学生是第 k 个到达军训基地的学生,你只需在 [1, k] 范围内生成一个随机数 p,如果 p \leq k,就让这个学生和主方队中的第 p 个队员交换,原先的队员出队他进队,这样在任意时刻,当前的这最终主方队的100队员,一定都是当前总样本下最公平的选择

蓄水池采样策略,本质上就是一个“流式”采样策略

4.2.1 加权蓄水池采样(WRS, Weighted Reservoir Sampling)

可以发现,前面举得例子中,样本的均匀的,如果样本分布不均匀,就需要对其进行扩展,加权蓄水池采样应运而生,不用害怕公式有多复杂,只需要知道它的本质思路是和蓄水池采样一样的,就可以

扩展后的问题:从 n 个数据的池子 X 中,抽选 m 个样本,其中数据池 X 中的第 i 个样本 x_i 的权重为 w\left(x_i\right),除此之外,n 的大小是动态的,可能后面会非常大且不可预知。请问你如何确保在 n 每次扩容后,都能从当前的数据池中选出 m 个样本,且确保其满足重要性采样规则

加权蓄水池采样(WRS, Weighted Reservoir Sampling) 的步骤如下:当前蓄水池 Y 中已有 t-1 个样本,那么蓄水池的下一个要被选择的样本 x_t 按照如下规则选出,这个 x_t 被称为 Reservoir

  1. 重新遍历总样本池 X 的所有数据,假设已经遍历了前 k-1 个样本,当前备选样本为 x_t当前权重和 w_{\text {sum }}=\sum_{i=1}^{k-1} w\left(x_i\right)
  2. 紧接着遍历总样本池 X 中的第 k 个样本,并在 [0, 1] 范围生成一个随机整数 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值