refract.frag 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #version 120
  2. uniform sampler2D texture;
  3. uniform sampler2D desktop;
  4. uniform int desktopWidth;
  5. uniform int desktopHeight;
  6. uniform float time;
  7. varying vec2 uvCoord;
  8. vec2 getDesktopUV( vec2 uv ) {
  9. // Desktop image is upside-down, blame X11 lmao
  10. uv.y = -uv.y;
  11. return uv;
  12. }
  13. const float pi = 3.14159265f;
  14. void main() {
  15. float sigma = 5;
  16. float numBlurPixelsPerSide = 2.0f;
  17. float blurMultiplier = 2.0f;
  18. vec2 tc = uvCoord.xy;
  19. vec2 p = -1.0 + 2.0 * tc;
  20. float len = length(p);
  21. vec2 offset = (p/len)*cos(len*12.0-time*4.0)*0.005;
  22. // Incremental Gaussian Coefficent Calculation (See GPU Gems 3 pp. 877 - 889)
  23. float blurSize = 1.f/desktopWidth*blurMultiplier;
  24. vec2 blurMultiplyVec = vec2(0.0f, 1.0f);
  25. vec3 incrementalGaussian;
  26. incrementalGaussian.x = 1.0f / (sqrt(2.0f * pi) * sigma);
  27. incrementalGaussian.y = exp(-0.5f / (sigma * sigma));
  28. incrementalGaussian.z = incrementalGaussian.y * incrementalGaussian.y;
  29. vec4 avgValue = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  30. float coefficientSum = 0.0f;
  31. // Take the central sample first...
  32. vec4 color = texture2D( desktop, getDesktopUV( uvCoord.xy ) + offset );
  33. color.a = texture2D( texture, uvCoord.xy ).a;
  34. avgValue += color * incrementalGaussian.x;
  35. coefficientSum += incrementalGaussian.x;
  36. incrementalGaussian.xy *= incrementalGaussian.yz;
  37. // Go through the remaining 8 vertical samples (4 on each side of the center)
  38. for (float i = 1.0f; i <= numBlurPixelsPerSide; i++) {
  39. vec2 uv = (uvCoord.xy - i * blurSize * blurMultiplyVec);
  40. color = texture2D( desktop, getDesktopUV( uv ) + offset );
  41. color.a = texture2D( texture, uv ).a;
  42. avgValue += color * incrementalGaussian.x;
  43. uv = (uvCoord.xy + i * blurSize * blurMultiplyVec);
  44. color = texture2D( desktop, getDesktopUV( uv ) + offset );
  45. color.a = texture2D( texture, uv ).a;
  46. avgValue += color * incrementalGaussian.x;
  47. coefficientSum += 2 * incrementalGaussian.x;
  48. incrementalGaussian.xy *= incrementalGaussian.yz;
  49. }
  50. //Reset
  51. blurSize = 1.f/desktopWidth*blurMultiplier;
  52. blurMultiplyVec = vec2(1.0f, 0.0f);
  53. incrementalGaussian.x = 1.0f / (sqrt(2.0f * pi) * sigma);
  54. incrementalGaussian.y = exp(-0.5f / (sigma * sigma));
  55. incrementalGaussian.z = incrementalGaussian.y * incrementalGaussian.y;
  56. // Go through the remaining 8 horizontal samples (4 on each side of the center)
  57. for (float i = 1.0f; i <= numBlurPixelsPerSide; i++) {
  58. vec2 uv = (uvCoord.xy - i * blurSize * blurMultiplyVec);
  59. vec4 color = texture2D( desktop, getDesktopUV( uv ) + offset );
  60. color.a = texture2D( texture, uv ).a;
  61. avgValue += color * incrementalGaussian.x;
  62. uv = (uvCoord.xy + i * blurSize * blurMultiplyVec);
  63. color = texture2D( desktop, getDesktopUV( uv ) + offset );
  64. color.a = texture2D( texture, uv ).a;
  65. avgValue += color * incrementalGaussian.x;
  66. coefficientSum += 2 * incrementalGaussian.x;
  67. incrementalGaussian.xy *= incrementalGaussian.yz;
  68. }
  69. gl_FragColor = avgValue / coefficientSum;
  70. }