原文见:ReSTIR GI
数学基础
ReSTIR GI的数学基础是关键性重采样(Importance Resampling)。数学方面我也没有彻底搞懂,只是借用这篇论文的解释做一个直观的说明。
假设我们想用pdf g从抽样分布中生成样本,但不能直接这样做(例如有可能是g太复杂,也有可能是不连贯等原因),因为g没有解析封闭形式,或者太复杂而无法积分和反演。此时,我们可以从一个简单的源分布p中生成一组样本,数量为M,对这些样本进行适当的加权,然后按照加权的比例重新对这些样本进行抽样,就可以得到一个对不同于p的采样的近似。更进一步,如果我们将权值设为Wj=g(Xj)/p(Xj),那么重抽样的结果分布就会是一个对g抽样的近似。M越大,对g的近似就越准确。
算法描述
ReSTIR GI核心思路的精华都集中在下面这张图中:即发现了一个有效的采样点后,会在时域和空域对这个采样点进行分享。不论这个有效采样点的光路多复杂,只要将最后一个碰撞点与领域像素点连接即可让领域也获得一条有效光路。
ReSTIR GI的关键思路就是时域和空域的RayTracing复用。在Initial Sample阶段正常RayTracing,对于最终能命中光源的像素存储有效的Scattered Radiance信息,而对于未能命中光源的像素置为Invalid。第二步Temporal Reservoir,如果上一步像素为Invalid,则一定会复用之前的命中信息,如果命中有效,则会按照关键性重采样的比例来概率更新时域的命中信息。同时,每一个有效命中都会增加关键性重采样的总权值。第三步Spatial Reservoir同理,只不过这次考虑的不是时域信息而是空域信息。
此处所说Bias,是在共享有效采样点时会遇到的问题,那就是空域共享时,相邻像素对同一个采样点的可见性可能时不同的,采样点对相邻像素的Radiance也是不同的。雅各比项所作的操作就是按照比例重新计算Radiance。
除了核心部分外还有很多工程性细节,比如按照tile随机对部分区域multi-bounce在保证GPU线程同步的同时提高bounce数期望,M的数量会被限制到一个最大值以避免累计太多无法更新数据,每隔一定帧数会对缓存的采样点信息进行验证并清除失效信息来适应动态场景,等等。具体细节详见论文原文。
局限性
时域局限性——鬼影,延迟
不适用于Glossy表面,原因有二:一是在实现中,Sample Point被假设为Lambertian散射;二是在空域共享时,Glossy表面的lobe非常集中,这会导致共享的Sample Point几乎不可见
最后,ReSTIR GI并不是一个滤波技术,而本质是一个优化PathTracing降低方差的技术,但它却在PathTracing中引入了时域和空域信息,这有可能对后续的滤波操作产生影响,因为许多滤波操作默认原始数据不包含时域信息。