径向模糊(Radial Blur)推导及实现-GLSL

发布于:2022-12-31 ⋅ 阅读:(228) ⋅ 点赞:(0)

先上源码:

out vec4 FragColor;// 输出颜色

in vec2 inputUV;// 输入纹理坐标
uniform sampler2D inputTexture;// 输入纹理
uniform float amount;// 循环采样次数
uniform float lineMod;// 径向模糊模式(1.0 直线/ 0.0圆形)
uniform vec2 center;// 中心点

const float sampleRangePrecision=4./1000.;// 设置一个采样精度

void main(){
  vec4 result=vec4(0.);// 初始化一个默认输出
  vec2 sampleUV=vec2(0.);// 初始化一个偏移后的纹理坐标
  vec2 offset=inputUV-center;// 计算偏移量
  offset=mix(vec2(-offset.y,offset.x),offset,sign(lineMod));// 选择直线/圆形径向模糊
  for(float i=-amount;i<amount;i++){
    sampleUV=inputUV+offset*sampleRangePrecision*i;// 根据采样精度和循环采样次数对采样点进行偏移
    vec4 offsetColor=texture(inputTexture,sampleUV);// 获取目标偏移后像素颜色
    result+=offsetColor;// 累加获取到的像素颜色
  }
  result/=2.0*amount;// 加权平均
  FragColor=result;// 输出颜色
}

1. 径向模糊(直线)

分析过程:
        对比径向模糊效果前后的效果,发现是从一个点,向四周发散的效果,既然是模糊相关效果,就属于加权平均的问题(考虑均值模糊)。

推导过程:
 1. 假设有一个中心点为C(0.5, 0.5)
 2. 假设有一条直线OA穿过中心点C
 3. 假设当前的纹理坐标点为C1点
        当采样次数为1次时:
                C1的对应纹理颜色值为原始值;
        当采样次数为2次时:
                C1的对应纹理颜色值应该为(C1+C2)/2.0
        当采样次数为n次时:
                C1的对应纹理颜色值应该为(C1+C2+Cn...)/n
4. C,C1为已知量,C2 - Cn为未知量,那么是否可以通过某种方式表示C2 - Cn

假设C1(0.6, 0.6) 某个增长量为u(x, x), 求C2的坐标(只做一次加权):
        C2 = C1 + u = (0.6+x, 0.6+x)
        C1的颜色值 = (C1颜色+C2颜色)/2.0

当需要做多次加权时,则重复上面的步骤,得到C3的坐标,进而加权平均求出C1的颜色。
只要采样点Cn足够多足够细,质量就会越好。
参考各类主流设计软件(photoshop/after effects)将近似的增长量定为sampleRangePrecision=4.0/1000;
至此就可以计算出直线径向模糊。

2. 径向模糊(圆形)

 稍后添加

本文含有隐藏内容,请 开通VIP 后查看