noise.fp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #version 140
  2. in mediump vec2 var_texcoord0;
  3. uniform fs_uniforms
  4. {
  5. mediump vec4 time;
  6. };
  7. out mediump vec4 out_fragColor;
  8. // noise shader from https://www.shadertoy.com/view/XXBcDz
  9. // pseudo random generator (white noise)
  10. float rand(vec2 n)
  11. {
  12. return fract(sin(dot(n, vec2(12.9898, 78.233))) * 43758.5453);
  13. }
  14. // value noise
  15. float noise(vec2 p)
  16. {
  17. vec2 ip = floor(p);
  18. vec2 u = fract(p);
  19. u = u * u * (3.0 - 2.0 * u);
  20. float x = mix(rand(ip), rand(ip + vec2(1.0, 0.0)), u.x);
  21. float y = mix(rand(ip + vec2(0.0, 1.0)), rand(ip + vec2(1.0, 1.0)), u.x);
  22. float a = u.y;
  23. float res = mix(x, y, a);
  24. return res * res;
  25. }
  26. // used to rotate domain of noise function
  27. const mat2 rot = mat2( 0.80, 0.60, -0.60, 0.80 );
  28. // fast implementation
  29. float fbm( vec2 p )
  30. {
  31. float f = 0.0;
  32. f += 0.500000 * noise( p ); p = rot * p * 2.02;
  33. f += 0.031250 * noise( p ); p = rot * p * 2.01;
  34. f += 0.250000 * noise( p ); p = rot * p * 2.03;
  35. f += 0.125000 * noise( p + 0.1 * sin(time.x) + 0.8 * time.x ); p = rot * p * 2.01;
  36. f += 0.062500 * noise( p + 0.3 * sin(time.x) ); p = rot * p * 2.04;
  37. f += 0.015625 * noise( p );
  38. return f / 0.96875;
  39. }
  40. void main()
  41. {
  42. float n = fbm(var_texcoord0.xy);
  43. out_fragColor = vec4(n, n, n, 1.0);
  44. }