高品质后处理渲染技术分享:十种图像模糊算法的总结与实现( 六 )

}


Box Blur完整的Runtime + Shader实现可见:

https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/BoxBlur


另外也可以考虑将uv计算放到vertex层 。

Box Blur的渲染效果接近高斯模糊 , 但性价比并不高 , 需要较多的迭代次数才能达到高品质的模糊效果:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


以下是Box Blur在BlurRadius为1.6 , Iteration为6 , RTDownScale为1的设置下模糊过程的动图:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


三、Kawase模糊(Kawase Blur)


Kawase Blur于Masaki Kawase 在GDC2003的分享《Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless)》中提出 。 Kawase Blur最初用于Bloom后处理特效 , 但其可以推广作为专门的模糊算法使用 , 且在模糊外观表现上与高斯模糊非常接近 。 Kawase Blur的思路是对距离当前像素越来越远的地方对四个角进行采样 , 且在两个大小相等的纹理之间进行乒乓式的blit 。 创新点在于 , 采用了随迭代次数移动的blur kernel , 而不是类似高斯模糊 , 或box blur一样从头到尾固定的blur kernel 。

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


实践数据表明 , 在相似的模糊表现下 , Kawase Blur比经过优化的高斯模糊的性能约快1.5倍到3倍 。

具体思路是在runtime层 , 基于当前迭代次数 , 对每次模糊的半径进行设置 , 而Shader层实现一个4 tap的Kawase Filter即可:

half4 KawaseBlur(TEXTURE2D_ARGS(tex, samplerTex), float2 uv, float2 texelSize, half pixelOffset)
{
half4 o = 0;
o += SAMPLE_TEXTURE2D(tex, samplerTex, uv + float2(pixelOffset +0.5, pixelOffset +0.5) * texelSize);
o += SAMPLE_TEXTURE2D(tex, samplerTex, uv + float2(-pixelOffset -0.5, pixelOffset +0.5) * texelSize);
o += SAMPLE_TEXTURE2D(tex, samplerTex, uv + float2(-pixelOffset -0.5, -pixelOffset -0.5) * texelSize);
o += SAMPLE_TEXTURE2D(tex, samplerTex, uv + float2(pixelOffset +0.5, -pixelOffset -0.5) * texelSize);
return o * 0.25;
}

完整的Runtime + Shader实现可见:

https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/KawaseBlur


推荐阅读