#version 410 core uniform float fGlobalTime; // in seconds uniform vec2 v2Resolution; // viewport resolution (in pixels) uniform float fFrameTime; // duration of the last frame, in seconds 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 sampler1D texFFTIntegrated; // this is continually increasing uniform sampler2D texPreviousFrame; // screenshot of the previous frame uniform sampler2D texChecker; uniform sampler2D texNoise; uniform sampler2D texTex1; uniform sampler2D texTex2; uniform sampler2D texTex3; uniform sampler2D texTex4; layout(location = 0) out vec4 out_color; // out_color must be written in order to see anything #define time 0 //mod(fGlobalTime, 10.) #define rot(a) mat2(cos(a), sin(a), -sin(a), cos(a)) #define adv time*150. #define pi acos(-1.) #define m texture(texFFTSmoothed, 0.01).x * 100. float sb(vec3 p, vec3 s){ vec3 q = abs(p)-s; return max(max(q.z, q.y), q.x); } struct obj{ float d; vec3 l,s; }; bool glass; bool glass2; float glow; obj m1(vec3 p){ vec3 p0 = p; p0.z -= adv; p0.zy *= rot(1.5); p0.xz *= rot(sin(time)*5.); // pirueta1 vec3 p1 = p0; vec3 p2 = p0; vec3 p3 = p0; p2.x = abs(p2.x)-1.; p2.xy *= rot(10.); p2.y += .5; p3.y -= 1.; p3.x = abs(p3.x)-.5; p3.xz *= rot(-13.); float body = sb(p2, vec3(5., 1., .1)); float body2 = sb(p3, vec3(1., 2., .01)); float d = 0.; float cabin = length(p1)-1.; //d = min(body, d); //d = min(body2, d); glass2 = d < 0.01; // bg vec3 p4 = p; float ground = -p4.y+300.; d = min(ground, d); // structures const float rep = 20.; vec3 p5 = p; p5 = (fract(p/rep-.5)-.5)*rep; p5.yx = abs(p5.yx)-10.; float sts = sb(p5, vec3(vec2(.01), 5.)); glow += .1/(.1+sts*sts); d = max(sts, d); d = min(min(min(body, cabin), body2), d); //d = min(sts, d); return obj(d,vec3(0.123123123, .546456456, 0.567567567), vec3(0.2343423,.23423432, .567567)); } float glow2; obj map(vec3 p){ obj o = m1(p); const float rep = 40.; vec3 p1 = p; p1 = (fract(p/rep))*rep; p1.x = abs(p1.x)-5.; float d = sb(p1, vec3(5, 1., 1.)); //glow2 += 10./(.1+d*d); o.d = min(o.d, d); // test o.d = d; return o; } void main(void) { vec2 uv = vec2(gl_FragCoord.x / v2Resolution.x, gl_FragCoord.y / v2Resolution.y); uv -= 0.5; uv /= vec2(v2Resolution.y / v2Resolution.x, 1); float fov = 1.; vec3 s = vec3(0.0001, 0.0001, -15.); s.x += sin(time)*50.; vec3 t = vec3(0.); s.z += adv; t.z += adv; vec3 rz = normalize(t-s); vec3 rx = normalize(cross(rz, vec3(0., 1., 0.))); vec3 ry = normalize(cross(rz, rx)); vec3 r = normalize(rx*uv.x+ry*uv.y+rz*fov); // loop vec3 col = vec3(0.); vec3 p = s; const float MAX = 100.; float i = 0.; const vec2 e = vec2(0.01, 0.); obj o; for(; i < MAX; i++){ o = map(p); float d = o.d; if(abs(d) < 0.0001){ if(glass2){ vec3 n = normalize(d-vec3(map(p-e.xyy).d, map(p-e.yxy).d, map(p-e.yyx).d)); r = reflect(r, n); d += 4.; }else break; } p+=d*r; } col += 1.-i/MAX; col += glow*vec3(0.3*m, .4, .4-sin(time*.1)*3.5-.5*pi)*(.1+m); //col += glow2*vec3(1.)*.01; out_color = vec4(col, 1.); }