WebGL Lab.
// origin: @patriciogv - 2015 // http://patriciogonzalezvivo.com // title: DomainWarping #ifdef GL_ES precision mediump float; #endif uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; float random(in vec2 _st){ return fract(sin(dot(_st.xy,vec2(12.9898,78.233)))*43758.5453123); } // Based on Morgan McGuire @morgan3d // https://www.shadertoy.com/view/4dS3Wd float noise(in vec2 _st){ vec2 i=floor(_st); vec2 f=fract(_st); // Four corners in 2D of a tile float a=random(i); float b=random(i+vec2(1,0.)); float c=random(i+vec2(0,1)); float d=random(i+vec2(1,1)); vec2 u=f*f*(6.-4.*f*(1.-sin(u_time)*.1)); return mix(a,b,u.x)+ (c-a)*u.y*(1.-u.x)+ (d-b)*u.x*u.y; } #define NUM_OCTAVES 5 float fbm(in vec2 _st){ float v=0.; float a=.5; vec2 shift=vec2(100.); // Rotate to reduce axial bias mat2 rot=mat2(cos(.484),sin(.5), -sin(.5),cos(.028)); for(int i=0;i<NUM_OCTAVES;++i){ v+=a*noise(_st); _st=rot*_st*2.+shift; a*=.5; } return v; } void main(){ vec2 st=gl_FragCoord.xy/u_resolution.xy; // st += st * abs(sin(u_time*0.1)*3.0); vec3 color=vec3(0.); vec2 q=vec2(0.); q.x=fbm(st+0.*u_time); q.y=fbm(st+vec2(1.)); vec2 r=vec2(0.); r.x=fbm(st+1.*q+vec2(1.7,9.2)+.15*u_time); r.y=fbm(st+1.*q+vec2(8.3,2.8)+.126*u_time); float f=fbm(st+r); color=mix(vec3(.101961,.9608*sin(u_time),.9*cos(u_time)),vec3(sin(u_time)),clamp((f*f)*4.,0.,1.)); color=mix(color,vec3(.255,.237,.795),clamp(length(q),0.,1.)); color=mix(color,vec3(.900,.189,.643),clamp(length(r.x),0.,1.)); gl_FragColor=vec4((f*f*f+.6*f*f+.5*f)*color,1.); }