noise.fragment.fx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Source: https://www.shadertoy.com/view/4lB3zz
  2. // Uniforms
  3. uniform float brightness;
  4. uniform float persistence;
  5. uniform float timeScale;
  6. // Varyings
  7. varying vec2 vUV;
  8. // Functions
  9. vec2 hash22(vec2 p)
  10. {
  11. p = p * mat2(127.1, 311.7, 269.5, 183.3);
  12. p = -1.0 + 2.0 * fract(sin(p) * 43758.5453123);
  13. return sin(p * 6.283 + timeScale);
  14. }
  15. float interpolationNoise(vec2 p)
  16. {
  17. vec2 pi = floor(p);
  18. vec2 pf = p-pi;
  19. vec2 w = pf * pf * (3.-2. * pf);
  20. float f00 = dot(hash22(pi + vec2(.0,.0)), pf-vec2(.0,.0));
  21. float f01 = dot(hash22(pi + vec2(.0,1.)), pf-vec2(.0,1.));
  22. float f10 = dot(hash22(pi + vec2(1.0,0.)), pf-vec2(1.0,0.));
  23. float f11 = dot(hash22(pi + vec2(1.0,1.)), pf-vec2(1.0,1.));
  24. float xm1 = mix(f00,f10,w.x);
  25. float xm2 = mix(f01,f11,w.x);
  26. float ym = mix(xm1,xm2,w.y);
  27. return ym;
  28. }
  29. float perlinNoise2D(float x,float y)
  30. {
  31. float sum = 0.0;
  32. float frequency = 0.0;
  33. float amplitude = 0.0;
  34. for(int i = 0; i < OCTAVES; i++)
  35. {
  36. frequency = pow(2.0, float(i));
  37. amplitude = pow(persistence, float(i));
  38. sum = sum + interpolationNoise(vec2(x * frequency, y * frequency)) * amplitude;
  39. }
  40. return sum;
  41. }
  42. // Main
  43. void main(void)
  44. {
  45. float x = abs(vUV.x);
  46. float y = abs(vUV.y);
  47. float noise = brightness + (1.0 - brightness) * perlinNoise2D(x,y);
  48. gl_FragColor = vec4(noise, noise, noise, 1.0);
  49. }