summaryrefslogtreecommitdiff
path: root/shader.frag
blob: f76c9687a59a9db64db603bf81ef2da380d39bb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#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;
}

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(),0.5*(1.0-params[0]));
    coord = zoom(st(),sin(time));
    img = texture2D(images[0],coord);
    img -= params[1]*(1.0-texture2D(images[1],st()));
  }
  else if (program == 1) {
    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]));
    vec3 i2 = texture2D(images[2],coord).rgb;
    img.rgb = pow(img.rgb,5*i2);
  }
  else if (program == 2) {
    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 *= rotate2d(ticks); 
    vec3 i2 = texture2D(images[2],coord).rgb;
    img.rgb = pow(img.rgb,5*i2);
  }
  vec4 feedback = imageLoad(backbuffer,ist());
  img = mix(img,feedback,0.5);
  imageStore(backbuffer,ist(),img);
  fragColor = img;
  /*
  fragColor = vec4(params[1]);
    feedback.b += 0.01*cos(time/4.);
    color.r = max(i.r,feedback.r);
  */
}