/** * Ripples² * @author Jan Scheurer * @license CC-BY-SA 4.0 */ precision highp float; uniform float time; uniform vec2 resolution; float rand(vec2 p){return fract(sin(dot(p,vec2(12.412,38.5123)))*42164.5123);} const vec2 O=vec2(0,1); float bnoisea(vec2 b){b=floor(b);return (rand(b)+rand(b+O)+rand(b+O.yx)+rand(b+O.yy))*.25;} float bnoise(vec2 b){float time=time*.4;return mix(bnoisea(b+floor(time)),bnoisea(b+floor(time+1.)),fract(time));} mat2 r2d(float a){float sa=sin(a),ca=cos(a);return mat2(ca,sa,-sa,ca);} float pat(vec2 p) { for(int i=0;i<7;i++) p=max(abs(abs(p-4.)*r2d(.785)-5.5),vec2(0.,bnoise(vec2(i))-1.)); return bnoise(p.xx*40.+time); } void main() { vec2 p = ( gl_FragCoord.xy / resolution.xy )*2.-1.; p.x*=resolution.x/resolution.y; float T=time*.1+4.; vec3 ro=vec3(sin(T)*3.,2.5+sin(T+1.),cos(T)*3.), rd=normalize(vec3(p*r2d(.7+T),-2.)), mp=ro ; rd.yz*=r2d(1.5-cos(T+.3)*.5); rd.xz*=r2d(T); for(int i=0;i<50;i++)mp+=rd*(mp.y+pat(mp.xz*3.)*.4)*.15; gl_FragColor = vec4( vec3(pow(pow(.7/abs(mp.y)*.35,.5)*1.4*vec3(.4,.45,.5),vec3(5.))*2.)*max(1.-length(p)*.45,0.), 1.0 ); }