[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的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中Denoising相关函数的简单介绍

[gdc20]control的可破坏环境技术

[gdc20]Quad Mesh Simplification in Frostbite

GDC快讯,腾讯CMatrix布局云游戏B端领域

: 塞尔达组在GDC2017演讲的文字翻译:创新的勇气

来自java的wit.ai消息api调用