gaussian_blur.glsl 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. uniform sampler2D tex;
  2. uniform float sigma;
  3. uniform int dir;
  4. uniform float brightness;
  5. uniform float width;
  6. uniform float height;
  7. vec4 getTexture(vec2 uv) {
  8. if (uv.x < 3. / width)
  9. uv.x = 3. / width;
  10. if (uv.y < 3. / height)
  11. uv.y = 3. / height;
  12. if (uv.x > 1. - 3. / width)
  13. uv.x = 1. - 3. / width;
  14. if (uv.y > 1. - 3. / height)
  15. uv.y = 1. - 3. / height;
  16. return texture2D(tex, uv);
  17. }
  18. void main(void) {
  19. vec2 uv = cogl_tex_coord_in[0].xy;
  20. vec2 direction = vec2(dir, (1.0 - dir));
  21. float pixel_step;
  22. if (dir == 0)
  23. pixel_step = 1.0 / height;
  24. else
  25. pixel_step = 1.0 / width;
  26. vec3 gauss_coefficient;
  27. gauss_coefficient.x = 1.0 / (sqrt(2.0 * 3.14159265) * sigma);
  28. gauss_coefficient.y = exp(-0.5 / (sigma * sigma));
  29. gauss_coefficient.z = gauss_coefficient.y * gauss_coefficient.y;
  30. float gauss_coefficient_total = gauss_coefficient.x;
  31. vec4 ret = getTexture(uv) * gauss_coefficient.x;
  32. gauss_coefficient.xy *= gauss_coefficient.yz;
  33. int n_steps = int(ceil(1.5 * sigma)) * 2;
  34. for (int i = 1; i <= n_steps; i += 2) {
  35. float coefficient_subtotal = gauss_coefficient.x;
  36. gauss_coefficient.xy *= gauss_coefficient.yz;
  37. coefficient_subtotal += gauss_coefficient.x;
  38. float gauss_ratio = gauss_coefficient.x / coefficient_subtotal;
  39. float foffset = float(i) + gauss_ratio;
  40. vec2 offset = direction * foffset * pixel_step;
  41. ret += getTexture(uv + offset) * coefficient_subtotal;
  42. ret += getTexture(uv - offset) * coefficient_subtotal;
  43. gauss_coefficient_total += 2.0 * coefficient_subtotal;
  44. gauss_coefficient.xy *= gauss_coefficient.yz;
  45. }
  46. vec4 outColor = ret / gauss_coefficient_total;
  47. // apply brightness on the second pass (dir==0 comes last)
  48. if (dir == 0) {
  49. outColor.rgb *= brightness;
  50. }
  51. cogl_color_out = outColor;
  52. }