Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vec2 mod289(vec2 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
- vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
- vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
- vec3 permute(vec3 x) { return mod289(((x*34.0)+1.0)*x); }
- vec4 permute(vec4 x) { return mod289(((x*34.0)+1.0)*x); }
- /// <summary>
- /// 2D Noise by Ian McEwan, Ashima Arts.
- /// <summary>
- float snoise_2D (vec2 v)
- {
- const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0
- 0.366025403784439, // 0.5*(sqrt(3.0)-1.0)
- -0.577350269189626, // -1.0 + 2.0 * C.x
- 0.024390243902439); // 1.0 / 41.0
- // First corner
- vec2 i = floor(v + dot(v, C.yy) );
- vec2 x0 = v - i + dot(i, C.xx);
- // Other corners
- vec2 i1;
- i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
- vec4 x12 = x0.xyxy + C.xxzz;
- x12.xy -= i1;
- // Permutations
- i = mod289(i); // Avoid truncation effects in permutation
- vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))
- + i.x + vec3(0.0, i1.x, 1.0 ));
- vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0);
- m = m*m ;
- m = m*m ;
- // Gradients: 41 points uniformly over a line, mapped onto a diamond.
- // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287)
- vec3 x = 2.0 * fract(p * C.www) - 1.0;
- vec3 h = abs(x) - 0.5;
- vec3 ox = floor(x + 0.5);
- vec3 a0 = x - ox;
- // Normalise gradients implicitly by scaling m
- // Approximation of: m *= inversesqrt( a0*a0 + h*h );
- m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h );
- // Compute final noise value at P
- vec3 g;
- g.x = a0.x * x0.x + h.x * x0.y;
- g.yz = a0.yz * x12.xz + h.yz * x12.yw;
- return 130.0 * dot(m, g);
- }
- //DEBUG
- #define DROPS_TURBSIZE 15.f
- #define DROPS_TURBSHIFT vec4(0.35, 1, 0, 1)
- #define DROPS_TURBTIME sin(0.1/3.f)
- #define DROPS_TURBCOF 0.33
- vec2 l_jh2(vec2 f, vec4 s, float l)
- {
- vec2 x = s.xy, V = s.zw;
- float y = snoise_2D(f * vec2(DROPS_TURBSIZE, DROPS_TURBSIZE))*.5;
- vec4 r = vec4(y, y, y, 1);
- r.xy = vec2(r.x + r.z/4.f, r.y + r.x/2.f);
- r -= 1.5;
- r *= l;
- return (f + (x + V) *r.xy);
- }
- float noise(float t)
- {
- return fract(sin(t*10.0)*10.0);
- }
- float noise2(vec2 p)
- {
- return noise(p.x + noise(p.y));
- }
- float raindot(vec2 uv, vec2 id, float t)
- {
- vec2 p = 0.25 + 0.25 * vec2(noise2(id), noise2(id + vec2(1.0, 0.0)));
- float r = clamp(0.5 - mod(t + noise2(id), 1.0), 0.0, 1.0);
- return smoothstep(0.3 * r, 0.0, length(p - uv));
- }
- /////////////////////////////////////////////////////////////////////////////
- //rain pass
- #define r_size 5.f //raindrops size
- #define r_intensity 1.0
- void mainImage( out vec4 fragColor, in vec2 fragCoord )
- {
- //clean img and coords
- vec4 final;
- vec2 uv = fragCoord.xy / iResolution.xy;
- final = texture( iChannel0, uv);
- //rain pass
- float v = raindot(fract(mix(uv, l_jh2(uv, DROPS_TURBSHIFT, DROPS_TURBTIME), DROPS_TURBCOF) * r_size + vec2(0, 0.1 * iTime)), floor(uv * r_size + vec2(0, 0.1 * iTime)), iTime);
- vec2 rain = vec2(vec2(dFdx(v*0.5f), dFdy(v*0.5f)) / (v + r_size))*r_intensity;
- vec4 mask_rain = texture(iChannel0, uv+rain);
- /////////////////////////////////////////////////////////////////////////////
- //final combine
- final = mask_rain;
- fragColor = final;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement