- 接上文:蒙特卡洛方法
- 相关论文:《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 个样本代入蒙特卡洛积分方程 进行求解
代入之后是什么样的呢?这里我们回到前面 SIR 的部分:
- 我们目标是从概率密度函数为
的分布中进行采样,
为 Target PDF
- 从一个非常简单的 PDF:
中取出了 m 个样本,记为
- 而通过 SIR 方法进一步获得的样本 Y 中 有 n 个样本,分别为
那么最终的蒙特卡洛积分结果就应如下
而 服从的,应该是 SIR PDF:
:因此可以将 SIR PDF 作为重要性采样的 PDF,即
到此,我们就得到了一个简易版本的蒙特卡洛积分求解器
事实上,对于上面的蒙特卡洛积分求解器其实是一个弱化版的求解器。可以发现,我们在执行 SIR 步骤的时候:Y 样本中每一个 ,其实都是从同一个 X 样本中选取的
理论上,可以对要选取的每一个 ,都重新生成一份 X 样本,并且每次生成的 X 样本的总数量,也不再是固定的 m,而是不同的
,这样做的一个好处就是:更不容易出现相同的两个样本
,且最终方差也可能会更小,此时
,其中
就是指当获得 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 个样本)
- 遍历所有的 n 个数据,对于前 m 个数据,无脑全部加入“蓄水池”,此时蓄水池已满
- 从第 m+1 个数据开始,如果当前遍历到样本池中的第 i 个数据,则在 [1, i] 范围生成一个随机整数
,如果
,则将该数据与蓄水池中的第
个数据替换,否则该数据丢弃
- 重复步骤②,直到遍历完所有的 n 个数据,如果 n 此时扩容,则继续执行步骤②……
这个算法即可确保在任意时刻处理完前 k 个数据后,蓄水池中的 m 个数据都是以 的概率获得的
到此,如果你是前面题目中的教官,在了解了这个蓄水池采样算法后,大可不必放弃之前的抽样结果,更不需要在人全部到齐后再进行一次完全抽样,只需要对剩下新来的学生进行如上步骤②的操作即可:即假设当前学生是第 k 个到达军训基地的学生,你只需在 [1, k] 范围内生成一个随机数 ,如果
,就让这个学生和主方队中的第
个队员交换,原先的队员出队他进队,这样在任意时刻,当前的这最终主方队的100队员,一定都是当前总样本下最公平的选择
蓄水池采样策略,本质上就是一个“流式”采样策略
4.2.1 加权蓄水池采样(WRS, Weighted Reservoir Sampling)
可以发现,前面举得例子中,样本的均匀的,如果样本分布不均匀,就需要对其进行扩展,加权蓄水池采样应运而生,不用害怕公式有多复杂,只需要知道它的本质思路是和蓄水池采样一样的,就可以
扩展后的问题:从 n 个数据的池子 X 中,抽选 m 个样本,其中数据池 X 中的第 i 个样本 的权重为
,除此之外,n 的大小是动态的,可能后面会非常大且不可预知。请问你如何确保在 n 每次扩容后,都能从当前的数据池中选出 m 个样本,且确保其满足重要性采样规则
加权蓄水池采样(WRS, Weighted Reservoir Sampling) 的步骤如下:当前蓄水池 Y 中已有 个样本,那么蓄水池的下一个要被选择的样本
按照如下规则选出,这个
被称为 Reservoir
- 重新遍历总样本池 X 的所有数据,假设已经遍历了前
个样本,当前备选样本为
,当前权重和
- 紧接着遍历总样本池 X 中的第 k 个样本,并在 [0, 1] 范围生成一个随机整数 <