什么是Dual Kawase Blur

Kawase Blur是一种模糊半径不断向外扩张的模糊算法,与Gaussian Blur不同之处在于,Gaussian Blur用到的是模糊核,它需要处理两个维度,虽然效果好,但性能来说比较废;而Kawase Blur利用了GPU 硬件自带的双线性插值来大幅降低开销,如下图所示,原本Gaussian Blur需要采样九个像素点,但Gaussian Blur由于会选取目标像素点附近的四个红点,此时GPU会对红点做双线性插值,相比Gaussian Blur节省了五次采样

另一个和高斯模糊不同在于,Kawase Blur的模糊半径还会逐渐增大,这是为了让更多的像素点参与模糊,让模糊效果更好

而Dual Kawase Blur是基于Kawase Blur的一种改进算法,它同样也是利用双线性插值采样周围的点,但不同之处是,为了更好的性能,它先不断降低FrameBuffer的分辨率并对其进行与Kawase Blur相同的双线性插值的模糊操作;因为最终需要显示在屏幕上,所以需要不断升采样,且在升采样的过程中也进行模糊

一个有趣的问题是为什么Dual Kawase Blur算法中为什么要这么选点呢?答案是双线性插值。不难看出,左图降采样时,会采样目标像素点周围的16个像素点,这是基于Gaussian Blur做出的优化;但升采样时,从上图表面看上去是采样目标像素点周围的32个像素点,但因为双线性插值实际需要采样的像素点是12个周围的像素点一个目标像素点,也就是13个。虽然表面上看采样的像素点是降采样的一倍,但实际比降采样的还少!

Dual Kawase Blur是完美的吗?

存在的问题如下

  • 虽然Dual Kawase Blur利用了降低图像分辨率来优化性能,但事实上降低分辨率是有可能影响图像原本的连续的
  • Dual Kawase Blur对于像素点的选取是比较苛刻的,当扩大模糊核半径时,若不进行合理的扩大规则限制,有可能导致采样点位于像素点的中心,也就利用不到双线性插值的优势

解决之道

  • 一种方法是对原图像执行加权模糊以逼近Kawase Blur,并配合降采样;另一种方法是在第0次和第1次Dual Kawase间执行线性插值,来减少降采样的影响。综合来说,第二种更加省
  • 对于模糊半径,需要限制其采样偏移为一倍

Dual Kawase Blur实现

有位老哥已经提供了这个版本的Dual Kawase Blur的实现,具体看这。他避免降采样的影响的方法笔者暂时还不太理解,有兴趣可以看看哦

Reference

几乎连续的双Kawase模糊

Dual Blur and Its Implementation in Unity


他们曾如此骄傲的活过,贯彻始终