高品质后处理渲染技术分享:十种图像模糊算法的总结与实现(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代码实现如下:
推荐阅读
- 违反违反医疗事故处理条例 青岛交通医院被警告
- 个税APP提示退税“国库处理”……原来是这么回事!
- 陕西榆林女子制止两插队者被打 打人者已被警方处理
- 教师有这些行为或被开除!广东首份违反师德处理办法征求意见
- 推荐警惕!厨房突发爆燃竟和煤气无关,只因他这样处理剩菜剩饭…...
- 厨房突发爆燃,竟和煤气无关!只因他这样处理剩菜剩饭…
- 公积金速看!漯河将清理公积金长期封存账户,请及时处理
- 牵出黄岛一起打架牵出贩卖“笑气”案 三人被依法处理
- 外媒:美明尼苏达州总检察长将领导处理弗洛伊德案
- 【各个】幸福触手可及各个人物结局 迪丽热巴细节上处理的很好
