noise.fragment.fx 1.5 KB

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