//shader reference http://www.iquilezles.org/www/index.htm
uniform vec2 iResolution;
uniform float iGlobalTime;
uniform float mouseX;
uniform float mouseY;
const mat2 m = mat2( 0.80, 0.60, -0.60, 0.80 );
float noise( in vec2 x )
{
return sin(1.5*x.x)*sin(1.5*x.y);
}
float fbm4( vec2 p )
{
float f = 0.0;
f += 0.5000*noise( p ); p = m*p*mouseX;
f += 0.2500*noise( p ); p = m*p*mouseX;
f += 0.1250*noise( p ); p = m*p*mouseX;
f += 0.0625*noise( p );
return f/0.9375;
}
float fbm6( vec2 p )
{
float f = 0.0;
f += 0.500000*(0.5+0.5*noise( p )); p = m*p*2.32;
f += 0.250000*(0.5+0.5*noise( p )); p = m*p*2.33;
f += 0.125000*(0.5+0.5*noise( p )); p = m*p*2.31;
f += 0.062500*(0.5+0.5*noise( p )); p = m*p*2.34;
f += 0.031250*(0.5+0.5*noise( p )); p = m*p*2.31;
f += 0.015625*(0.5+0.5*noise( p ));
return f/0.96875;
}
float func( vec2 q, out vec4 ron )
{
float ql = length( q );
q.x += 0.05*sin(0.27*iGlobalTime+ql*4.1);
q.y += 0.05*sin(0.23*iGlobalTime+ql*4.3);
q *= 0.5;
vec2 o = vec2(0.0);
o.x = 0.5 + 0.5*fbm4( vec2(15.0*q +vec2(3.2) ) );
o.y = 0.5 + 0.5*fbm4( vec2(15*q+vec2(5.2)) );
float ol = length( o );
o.x += 0.2*sin((0.12*iGlobalTime+ol))/ol;
o.y += 0.2*cos((0.14*iGlobalTime*2+ol))/ol;
vec2 n;
n.x = fbm6( vec2(4.0*o+vec2(9.2)) );
n.y = fbm6( vec2(4.0*o+vec2(5.7)) );
//illuminacion
vec2 p = 8.0*q + 8.0*n;
float f = 0.5 + 0.5*fbm4( p );
f = mix( f, f*f*f*1.5, f*abs(n.y) );
float g = 0.5 + 0.5*sin(sin(4.0*p.x))*sin(cos(4.0*p.y));
f *= 1.0-0.5*pow( g, 28.0 );
ron = vec4( o, n );
return f;
}
vec3 doMagic(vec2 p)
{
vec2 q = p*0.0005;
vec4 on = vec4(0.0);
float f = func(q, on);
vec3 col = vec3(0.0);
col = mix( vec3(mouseY,0.01,0.08), vec3(0.2,0.38,0.9), f );
col = mix( col, vec3(0.2,0.9,0.0), dot(on.zw,on.zw) );
col = mix( col, vec3(0.2,0.9,0.9), 0.2*on.y*on.y );
//fondo
col = mix( col, vec3(0.02,0.0,0.5), 0.9*smoothstep(1.2,1.3,abs(on.z)+abs(on.w)) );
col = clamp( col*f*2.0, 0.0, 1.0 );
vec3 nor = normalize( vec3( dFdx(f)*iResolution.x, 6.0, dFdy(f)*iResolution.y ) );
vec3 lig = normalize( vec3( 0.9, -0.2, -0.4 ) );
float dif = clamp( 0.3+0.7*dot( nor, lig ), 0.0, 1.0 );
vec3 bdrf;
bdrf = vec3(0.70,0.7,0.95)*(nor.y*0.5+0.5);
bdrf += vec3(0.15,0.10,0.05)*dif;
col *= 1.2*bdrf;
col = 1.0-col;
return 1.1*col*col;
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 q = fragCoord.xy / iResolution.xy;
vec2 p = -1.0 + 2.0 * q;
p.x *= iResolution.x/(iResolution.y);
p.y *= iResolution.x/(iResolution.y);
fragColor = vec4( doMagic( p ), 1.0 );
}
void main() {
mainImage(gl_FragColor,gl_FragCoord.xy);
}