#version 450 core #ifdef GL_ES precision mediump float; #endif uniform vec2 resolution; uniform float time; uniform float ticks; uniform int program; uniform sampler2D images[8]; layout (binding = 0,rgba32f) uniform image2D backbuffer; uniform float params[4]; out vec4 fragColor; float random (in float x) { return fract(sin(x)*43758.5453123)-0.5; } vec2 st() { return gl_FragCoord.xy/resolution.xy; } ivec2 ist() { return ivec2(gl_FragCoord.xy/resolution.xy*resolution); } vec2 zoom(vec2 st, float amount) { st -= 0.5; st *= amount; st += 0.5; return st; } vec2 translate(vec2 st, vec2 amount) { st -= 0.5; st += amount; st += 0.5; return st; } vec2 rotate(vec2 st, float angle) { st -= 0.5; st *= angle; st += 0.5; return st; } mat2 rotate2d(float _angle){ return mat2(cos(_angle),-sin(_angle), sin(_angle),cos(_angle)); } void main (void) { vec4 img; vec2 coord; if (program == 0) { coord = zoom(st(),1.0-0.5*(1.0-params[0])); img = texture2D(images[0],coord); vec2 tc = st(); tc = zoom(tc,2.0); tc.y *= 1.5; tc = translate(tc,vec2(-0.35,0.55)); vec4 title = texture2D(images[1],tc); img -= params[1]*0.7*title; } else if (program == 1) { coord = zoom(st(),1.0-0.5*(1.0-params[0])); img = texture2D(images[0],coord); coord = zoom(st(),1.0-0.5*(1.0-params[2])); coord = translate(coord,vec2(-0.1,-0.1)); vec3 i2 = texture2D(images[2],coord).rgb; img.rgb = 2.5*pow((1.0-2.3*img.rgb),1.0+(1.0-params[1])*2*i2); } else if (program == 2) { coord = zoom(st(),1.0-0.5*(1.0-params[2])); coord = translate(coord,vec2(-0.1,-0.1)); img = texture2D(images[2],coord); coord = zoom(st(),1.0-0.5*(1.0-params[0])); vec3 i2 = texture2D(images[0],coord).rgb; img.rgb = pow((1.0-2.3*img.rgb),1.0+(1.0-params[1])*2*i2); } else if (program == 3) { coord = zoom(st(),1.0-0.5*(1.0-params[0])); coord = rotate(coord,0.1); img = texture2D(images[3],coord); coord = zoom(st(),0.7-0.5*(1.0-params[2])); coord = translate(coord,vec2(-0.1,0.2)); vec3 i2 = texture2D(images[2],coord).rgb; img.rgb = pow((1.0-2.3*img.rgb),params[3]*5*i2); /* coord = st() + 0.5; coord -= 0.5; img = texture2D(images[3],coord); coord = zoom(st(),0.5*(1.0-0.5*params[0])); coord = rotate2d(sin(ticks))*coord; vec3 i2 = texture2D(images[0],coord).rgb; img.rgb = 2.0*pow((1.0-2.0*i2),params[3]*50*img.rgb); */ } else if (program == 4) { coord = zoom(st(),(1.0-1.5*params[0])); img = texture2D(images[3],coord); coord = zoom(st(),0.5*(1.0-0.5*params[2])); coord = translate(coord,vec2(0.2,0.15)); coord = rotate(coord,-0.1); vec3 i2 = texture2D(images[2],coord).rgb; img.rgb = pow((1.0-2.3*img.rgb),params[3]*5*i2); } else if (program == 5) { coord = zoom(st(),(1.0-1.5*params[0])); img = texture2D(images[2],coord); coord = zoom(st(),0.5*(1.0-0.5*params[2])); coord = translate(coord,vec2(0.2,0.15)); vec3 i2 = texture2D(images[3],coord).rgb; img.rgb = pow(img.rgb,5*i2); } else if (program == 6) { coord = zoom(st(),(1.0-1.5*params[0])); img = texture2D(images[2],coord); coord = zoom(st(),0.5*(1.0-0.5*params[2])); coord = translate(coord,vec2(0.2,0.15)); vec3 i2 = texture2D(images[3],coord).rgb; img.rgb = pow(img.rgb,5*i2); vec2 tc = st(); tc = zoom(tc,2.0); tc.y *= 1.5; tc = translate(tc,vec2(-0.35,0.15)); vec4 title = texture2D(images[1],tc); tc = st(); tc = zoom(tc,2.0); tc = translate(tc,vec2(-0.35,0.35)); tc.y *= 3.5; vec4 subtitle = texture2D(images[4],tc); img += params[3]*title + subtitle; } imageStore(backbuffer,ist(),img); if (program != 0) { vec4 feedback = imageLoad(backbuffer,ist()); img = mix(feedback,img,0.4); } fragColor = img; /* fragColor = vec4(params[1]); feedback.b += 0.01*cos(time/4.); color.r = max(i.r,feedback.r); */ }