[gdc20]Fast Denoising With Self Stabilizing Recurrent Blurs
Posted 安柏霖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[gdc20]Fast Denoising With Self Stabilizing Recurrent Blurs相关的知识,希望对你有一定的参考价值。
gdc20上nvidia带来,整体上是对于metro gdc19的在denoise方面(地铁中的光追GI)的延续和持续的改进,在大思路比较近似的情况下,在从整体到细节上做了提升;
研究的工作也比较细致,读起来很有感觉;
overview
整体上是一个denoiser,用于使用monte carlo做ray tracing然后denoise的情况(而不是类似surfel based的技术);
在space&temporal上面的weight选择上,结合业内的技术做法,有很多的改进综合,效率和效果都比较好;
pipeline:
整体是这样的一个过程,可以达到比较好的效果,
- 质量更好
- 可以同时用于specular和diffuse
效率也比较可以接受:
一般我们使用dlss等,可以把这个降到更低;
重点关注:importance sampling
整体技术本身:围绕signal processing来的,realtime graphics本身就是对signal processing应用非常重的点,而denoise这里更是;
甚至可以说就是如何让整个过程的importance sampling做的更好;
recurrent blur
所谓的recurrent blur就是这样:accumulation接着blur,然后再来一轮这种
相比于下面两种方式:
recurrent blur本身信息更加充分,同时有
- 低频的noisy的输入信息
- 高频的结果信息(结果,上一帧的结果)
两者都有的情况下,更容易做好importance sampling:
- 比如在有occluded的情况下,使用fallback方案
- 在有变动比较大的情况下,进行剔除等等
整体上是这样一个思路,也和地铁的方案比较像;
recurrent blur的稳定性&细节
这里使用成功accumulate的frame数量来控制blur的radius,越是成功accumulate的sample,radius就越小(如图中白色部分),如果是出现历史积累少的点(occluded等因素),那么radius就大;
这样也尽最大程度的让结果stable&保留细节:
- 积累frame少的case,就是用大radius,这样就减少artifact:更加stable
- 积累frame多的case,就使用小radius,这样在stable的前提下保留更多的细节
(可以看到上图中,如果我们一律使用大radius的,就会最右面一样,虽然非常stable,但是细节都没了,可以看到左边的indirect lighting shadow就好很多)
(另外再看经过几帧之后的结果)
ghost free temporal reprojection
这里上来先说了要使用linear weight而不是exponentialweight,我印象中大多数都是linear weight,所以就不展开了。
然后是ghost free temporal reprojection,
这里要做的就是custom bilinear filter,把不需要的坏点能够去掉即可。
hierarchical history reconstruction
会产生这样的mips(有点像glossy reflection)
在up sampling是用的bilateral upsampling,然后会根据:
- accumulated frames
- roughness
来选择哪一个mip
其起到的作用是在bilateral upsampling的时候,可以有充分的历史信息作为fallback方案;
sampling space
这里就是选择对于diffuse和specular来说,最有效的sample(更好的importance sampling);
这里直接上结论就好了,ggx dominant direction的垂直平面上来blur;
sampling weight
这里的weight分为三种:
- geometry:tangent plane上的distance
- normal:两个normal的夹角,如果高于specular lobe的half angle,就要丢弃
- roughness:如果sample的点和中心点差距太大,也要丢弃:
生成denoiser
(diffuse denoiser的input/output)
(specular denoiser的input/output)
specular denoiser
specular denoiser更加复杂一些;
parallax
specular这里引入一个“parallax”(前后帧的view vector的变化)变量来控制积累的速度,因为在specular case下,与diffuse case不同。
diffuse再换了角度之后,普通lambertian下,都是一样的,这样motion vector就够了;
specular更多和角度有关,所以使用这个parallax来做;
hit distance
距离也引入了作为weight;
以上是关于[gdc20]Fast Denoising With Self Stabilizing Recurrent Blurs的主要内容,如果未能解决你的问题,请参考以下文章