Shader特效——“径向模糊”的实现 【GLSL】

来源:互联网 发布:周泓旭 知乎 编辑:程序博客网 时间:2024/05/02 01:18


效果图:




glsl代码如下:

#ifdef GL_ESprecision mediump float;#endifuniform sampler2D iChannel0;uniform vec2 centerpos;// 径向中心uniform float GlowRange;// 径向范围void main(){   vec2 uv = gl_FragCoord.xy / vec2(512., 512.);   vec4 clraverge = vec4(0, 0, 0, 0);   float range = GlowRange, count = 0, x1, y1;   vec2 cpos = centerpos;   for (float j = 1; j <= range; j += 1)   {      // 横坐标为圆心坐标时,计算k分母为0      if (cpos.x - uv.x == 0)       {       x1 = uv.x;       //y 方向上一定范围内的采样(0 - 1/10的差值)       y1 = uv.y + (cpos.y - uv.y) * j / (10 * range);       }       else      {         // 直线的斜率         float k = (cpos.y - uv.y) / (cpos.x - uv.x);         // x 方向         x1 = uv.x + (cpos.x - uv.x) * j / (10. * range);         // 如果采样邻域超过了径向中心         /*if ((cpos.x - uv.x) * (cpos.x - x1) < 0)          {          x1 = cpos.x;          }*/         // k 方向         y1 = cpos.y - (cpos.x - x1) * k;         // 如果超出指定范围则跳过         if (x1 < 0. || y1 < 0. || x1 > 1. || y1 > 1.)         {            continue;         }      }      clraverge += texture2D(iChannel0, vec2(x1, y1));      count += 1;   }   // 取径向范围内的平均值   clraverge /= count;   gl_FragColor = clraverge;}

更早的一篇介绍径向模糊的日志 

0 0