| #ifdef GL_ES |
| precision mediump float; |
| #endif |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| uniform mat3 outputToWorld; |
| |
| uniform vec4 color1; |
| uniform vec4 color2; |
| uniform float detail; |
| uniform float time; |
| |
| const float pi_twice = 6.283185307; |
| |
| |
| float snoise(vec3 uv, float res) |
| { |
| const vec3 s = vec3(1e0, 1e2, 1e4); |
| |
| uv *= res; |
| |
| vec3 uv0 = floor(mod(uv, res))*s; |
| vec3 uv1 = floor(mod(uv+vec3(1.), res))*s; |
| |
| vec3 f = fract(uv); |
| f = f*f*(3.0-2.0*f); |
| |
| vec4 v = vec4(uv0.x+uv0.y+uv0.z, uv1.x+uv0.y+uv0.z, |
| uv0.x+uv1.y+uv0.z, uv1.x+uv1.y+uv0.z); |
| |
| vec4 r = fract(sin(v*1e-3)*1e5); |
| float r0 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y); |
| |
| r = fract(sin((v + uv1.z - uv0.z)*1e-3)*1e5); |
| float r1 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y); |
| |
| return 2.0 * mix(r0, r1, f.z) - 1.0; |
| } |
| |
| void main(void) |
| { |
| vec2 p = .002 * (outputToWorld * vec3(gl_FragCoord.xy, 1.0)).xy; |
| |
| float color = 3.0 * (1.0 - 2.0 * length(p)); |
| vec3 coord = vec3(atan(p.y, p.x) / pi_twice, length(p) * 0.4, 0.0); |
| |
| for(int i = 1; i <= 7; i++) |
| { |
| float power = pow(2.0, float(i)); |
| vec3 timed = vec3(0.0, - time*.02, time*.01); |
| |
| color += 1.5 * snoise(coord + timed, power * detail) / power; |
| } |
| |
| color = max(color, 0.); |
| |
| |
| |
| |
| |
| vec4 col1 = color1 * color1.a, col2 = color2 * color2.a; |
| |
| gl_FragColor = mix(col1, col2, color / 3.0); |
| gl_FragColor.a *= smoothstep(0.0, 1.0, color); |
| |
| gl_FragColor.rgb *= gl_FragColor.a; |
| } |
| |