说了bokeh blur,再来说个径向模糊(Radial Blur),先上图


可以看到,径向模糊就是从一个点往外扩散的模糊算法,看起来就很有速度感,可以用来模拟具有速度感的场景,然后也可以用来模拟体积光,或者丁达尔效应(具体做法为提取图片的高亮区域,然后对这一部分应用径向模糊算法,然后与原图进行混合输出)
算法思路就是
选取一个中心点 -> 每个像素点与该点求一个移动方向的向量 -> 对采样uv进行这个方向的偏移 -> 迭代一定次数后将采样的数值累加然后除以迭代次数
上代码
const int nsamples = 10;
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
//原始uv
vec2 uv = fragCoord.xy / iResolution.xy ;
//径向模糊的中心点
vec2 center = vec2(0.0);
//将uv转换至-1,1
vec2 new = uv * 2.0 - 1.0;
//模糊的大小
float blurSize = abs(cos(iTime)) * 0.01;
//从哪里开始模糊
float start = 0.0;
new.x = abs(new.x) > start ? new.x : 0.;
new.y = abs(new.y) > start ? new.y : 0.;
//模糊的方向向量
vec2 radVec = (center - new) * blurSize;
vec4 color = vec4(0.0);
for(int i = 0; i < nsamples; i++)
{
color += texture(iChannel0, uv);
//每次迭代都对uv加上这个模糊的方向向量
uv += radVec;
}
color /= float(nsamples);
fragColor = color;
}