径向模糊(Radial Blur)- day7
DaydreamLin
2023年03月06日 00:15

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

可以看到,径向模糊就是从一个点往外扩散的模糊算法,看起来就很有速度感,可以用来模拟具有速度感的场景,然后也可以用来模拟体积光,或者丁达尔效应(具体做法为提取图片的高亮区域,然后对这一部分应用径向模糊算法,然后与原图进行混合输出)

算法思路就是 

选取一个中心点 -> 每个像素点与该点求一个移动方向的向量 -> 对采样uv进行这个方向的偏移 -> 迭代一定次数后将采样的数值累加然后除以迭代次数

上代码

代码块
C++
自动换行
复制代码
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;
}
复制成功