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


文章图片


九、径向模糊(Radial Blur)


径向模糊(Radial Blur)可以给画面带来很好的速度感 , 是各类游戏中后处理的常客 , 也常用于Sun Shaft等后处理特效中作为光线投射的模拟 。

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


径向模糊的原理比较直接 , 首先选取一个径向轴心(Radial Center) , 然后将每一个采样点的uv基于此径向轴心进行偏移(offset) , 并进行一定次数的迭代采样 , 最终将采样得到的RGB值累加 , 并除以迭代次数 。

其核心算法的Shader代码实现如下:

half4 RadialBlur(VaryingsDefault i)
{
float2 blurVector = (_RadialCenter - i.texcoord.xy) * _BlurRadius;

half4 acumulateColor = half4(0, 0, 0, 0);

[unroll(30)]
for (int j = 0; j < _Iteration; j ++)
{
acumulateColor += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
i.texcoord.xy += blurVector;
}

return acumulateColor / _Iteration;
}

完整的Runtime + Shader实现可见:

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


另外需要注意的是 , 如果迭代次数不够多 , 而又设置了较高的Offset值 , 则会在屏幕四周出现较为明显的折痕 , 但一般情况下都还可以接受:

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


同样 , 对模糊半径(Blur Radius)参数的调节 , 可以控制模糊的程度:

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


十、方向模糊(Directional Blur)


方向模糊(Directional Blur)可以看做是径向模糊(Radial Blur)的一个变体 。 其主要思路是传入一个角度 , 然后在runtime层计算出对应的矢量方向:

float sinVal = (Mathf.Sin(settings.Angle) * settings.BlurRadius * 0.05f) / settings.Iteration;
float cosVal = (Mathf.Cos(settings.Angle) * settings.BlurRadius * 0.05f) / settings.Iteration;
sheet.properties.SetVector(ShaderIDs.Direction, new Vector2(sinVal, cosVal));

然后 , 在Shader层 , 将每一个采样点的uv基于此方向进行正负两次偏移(offset) , 接着进行一定次数的迭代采样 , 最终将采样得到的RGB值累加 , 并除以迭代次数 , 得到最终的输出 。

核心算法的Shader代码实现如下:


推荐阅读