#version 430 core uniform float fGlobalTime; // in seconds uniform vec2 v2Resolution; // viewport resolution (in pixels) uniform sampler1D texFFT; // towards 0.0 is bass / lower freq, towards 1.0 is higher / treble freq uniform sampler1D texFFTSmoothed; // this one has longer falloff and less harsh transients uniform sampler2D texBricks; uniform sampler2D texGrunge; uniform sampler2D texMono; uniform sampler2D texNoise; uniform sampler2D texNormal; uniform sampler2D texPaper; uniform sampler2D texPooBrain; #define M_PI_4 .78539 vec3 hash(vec2 p) { return fract(sin(vec3(dot(p, vec2(127., 371.)), dot(p, vec2(265., 419.)), dot(p, vec2(419., 371.))))*47358.5453); } float a(vec3 p) { return p.y-2.-(.5+.5*(sin(p.x*.01-fGlobalTime)*2.+cos(p.z*.1-fGlobalTime))); } vec4 v(vec2 p) { vec4 res = vec4(0., 0., 0., 8.); vec2 n = floor(p); vec2 f = fract(p); float st = 0.; float t = texture(texFFT, .007).x*10.; for(int i = -2; i<=2; ++i) for(int j = -2; j<= 2; ++j) { vec2 g = vec2(i, j); vec3 co = hash(n+g); vec2 o = .5+.5*sin(co.xy+6.*co.xy*t); vec2 r = g+o-f; float d = dot(r, r); float w = 1.-smoothstep(0., sqrt(2.), sqrt(d)); res.xyz += w*co; st +=w; if(d < res.w) res.w = d; } res.xyz/=st; return res; } float b(vec3 p) { return p.y-25.*v(p.xz*.01).w; } layout(location = 0) out vec4 out_color; // out_color must be written in order to see anything float scene(vec3 p) { return min(b(p), a(p)); } vec3 gn(vec3 p) { vec2 e = vec2(.002, 0.); return normalize(vec3(scene(p+e.xyy)-scene(p-e.xyy), scene(p+e.yxy)-scene(p-e.yxy), scene(p+e.yyx)-scene(p-e.yyx))); } void main(void) { vec2 uv =-1.+2.*gl_FragCoord.xy/v2Resolution; vec3 co = v(uv*4.).xyz; mat3 rotx = mat3(1., 0., 0., 0., cos(-M_PI_4), -sin(-M_PI_4), 0., sin(-M_PI_4), cos(-M_PI_4)); vec3 rd = normalize(rotx*vec3(uv, 1.)); vec3 o = vec3(sin(fGlobalTime)*100., 30., fGlobalTime*100.); vec3 p = o; vec3 pp = p; float d; for(int i = 0; i < 64; ++i) { d = scene(p); pp = p; p += d*rd; if(d < .001) break; } vec3 n = gn(p); if(d == b(pp)) { co = vec3(1., .9, .45)*max(dot(n, normalize(vec3(.25, .75, 1.))), 0.); co += vec3(.5, .4, .8)*max(dot(n, normalize(vec3(.5, .8, .6))), 0.); co = mix(co, vec3(.75, .8, .9), min(distance(p, o)*.001, 1.)); co = pow(co, vec3(2.2)); } else { co = vec3(0.5, 0.4, 0.8); vec3 ref = refract(rd, n, 1./1.474); /*co = vec3(1., .9, .45)*max(dot(n, normalize(vec3(.25, .75, 1.))), 0.); co += vec3(.5, .4, .8)*max(dot(n, normalize(vec3(.5, .8, .6))), 0.); co = mix(co, vec3(.75, .8, .9), min(distance(p, o)*.001, 1.)); co = pow(co, vec3(2.2));*/ } out_color = vec4(co, 1.); }