quaddamage

The whole ball of wax

Sep 10th, 2016
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifdef GL_ES
  2. precision mediump float;
  3. #endif
  4.  
  5. #define M_PI 3.1415926535897932384626433832795
  6. #define N 9.0
  7. #define ZOOM 10.0
  8. #define SPEED 0.25
  9.  
  10. uniform float time;
  11. uniform vec2 mouse;
  12. uniform vec2 resolution;
  13.  
  14. float post_process(float color) {
  15.     float m = mod(color, 2.0);
  16.     if (m >= 1.0)
  17.         color = 2.0 - m;
  18.     else
  19.         color = m;
  20.     return color;
  21. }
  22.  
  23. vec3 sample(vec2 p)
  24. {
  25.     float r = 0.0;
  26.     float g = 0.0;
  27.     float b = 0.0;
  28.  
  29.     //edit: manually unrolled the loop for my obviously broken shader compilers // fnord
  30.     //edit2: index correction for original palette
  31.         float i, a, t;
  32.  
  33.         i = 0.;
  34.         a = i * (2.0 * M_PI / N);
  35.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  36.         t = sqrt(abs(t));
  37.         r += t + 0.5 + 0.2 * i;
  38.         g += t + 1.0 + 0.4 * i;
  39.         b += t + 1.5 + 0.6 * i;
  40.  
  41.         i = 1.;
  42.         a = i * (2.0 * M_PI / N);
  43.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  44.         t = sqrt(abs(t));
  45.         r += t + 0.5 + 0.2 * i;
  46.         g += t + 1.0 + 0.4 * i;
  47.         b += t + 1.5 + 0.6 * i;
  48.  
  49.         i = 2.;
  50.         a = i * (2.0 * M_PI / N);
  51.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  52.         t = sqrt(abs(t));
  53.         r += t + 0.5 + 0.2 * i;
  54.         g += t + 1.0 + 0.4 * i;
  55.         b += t + 1.5 + 0.6 * i;
  56.  
  57.         i = 3.;
  58.         a = i * (2.0 * M_PI / N);
  59.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  60.         t = sqrt(abs(t));
  61.         r += t + 0.5 + 0.2 * i;
  62.         g += t + 1.0 + 0.4 * i;
  63.         b += t + 1.5 + 0.6 * i;
  64.  
  65.         i = 4.;
  66.         a = i * (2.0 * M_PI / N);
  67.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  68.         t = sqrt(abs(t));
  69.         r += t + 0.5 + 0.2 * i;
  70.         g += t + 1.0 + 0.4 * i;
  71.         b += t + 1.5 + 0.6 * i;
  72.  
  73.         i = 5.;
  74.         a = i * (2.0 * M_PI / N);
  75.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  76.         t = sqrt(abs(t));
  77.         r += t + 0.5 + 0.2 * i;
  78.         g += t + 1.0 + 0.4 * i;
  79.         b += t + 1.5 + 0.6 * i;
  80.  
  81.         i = 6.;
  82.         a = i * (2.0 * M_PI / N);
  83.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  84.         t = sqrt(abs(t));
  85.         r += t + 0.5 + 0.2 * i;
  86.         g += t + 1.0 + 0.4 * i;
  87.         b += t + 1.5 + 0.6 * i;
  88.  
  89.         i = 7.;
  90.         a = i * (2.0 * M_PI / N);
  91.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  92.         t = sqrt(abs(t));
  93.         r += t + 0.5 + 0.2 * i;
  94.         g += t + 1.0 + 0.4 * i;
  95.         b += t + 1.5 + 0.6 * i;
  96.  
  97.         i = 8.;
  98.         a = i * (2.0 * M_PI / N);
  99.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  100.         t = sqrt(abs(t));
  101.         r += t + 0.5 + 0.2 * i;
  102.         g += t + 1.0 + 0.4 * i;
  103.         b += t + 1.5 + 0.6 * i;
  104.     /*
  105.         i = 9.;
  106.         a = i * (2.0 * M_PI / N);
  107.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  108.         t = sqrt(abs(t));
  109.         r += t + 0.5 + 0.2 * i;
  110.         g += t + 1.0 + 0.4 * i;
  111.         b += t + 1.5 + 0.6 * i;
  112.  
  113.         i = 10.;
  114.         a = i * (2.0 * M_PI / N);
  115.         t = cos((p.x * cos(a) + p.y * sin(a)) + time * SPEED ) / 2.0;
  116.         t = sqrt(abs(t));
  117.         r += t + 0.5 + 0.2 * i;
  118.         g += t + 1.0 + 0.4 * i;
  119.         b += t + 1.5 + 0.6 * i;
  120.     */
  121.  
  122.     r = post_process(r);
  123.     g = post_process(g);
  124.     b = post_process(b);
  125.  
  126.     return vec3(r,g,b);
  127. }
  128.  
  129. float lum(const vec3 cColour)
  130. {
  131.     const vec3 cLum=vec3(0.299,0.587,0.114);
  132.     return dot(cColour,cLum);
  133. }
  134.  
  135. vec2 normal(const vec2 p,const float fEps)
  136. {
  137.     vec2 e=vec2(fEps,0.0);
  138.  
  139.     return normalize(vec2(
  140.         lum(sample(p+e.xy))-lum(sample(p-e.xy)),
  141.         lum(sample(p+e.yx))-lum(sample(p-e.yx))));
  142. }
  143.  
  144.  
  145.  
  146. float sigmoid(float x) {
  147.     return 2./(1. + exp2(-x)) - 1.;
  148. }
  149.  
  150.  
  151. void main( void ) {
  152.     vec2 position = gl_FragCoord.xy;
  153.     vec2 aspect = vec2(1.,resolution.y/resolution.x );
  154.     position -= 0.5*resolution;
  155.     vec2 position2 = 0.5 + (position-0.5)/resolution*256.*aspect;
  156.     float filter = sigmoid(pow(2.,5.5)*(length((position/resolution-mouse + 0.5)*aspect) - 0.1))*0.5 +0.5;
  157.     position -= (mouse-0.5)*resolution;
  158.     position = mix(position, position2, filter) - 0.5;
  159.  
  160.     vec2 p = position / ZOOM;
  161.  
  162.     vec3 c=sample(p);
  163.  
  164.     vec2 n=normal(p,0.01);
  165.     vec2 l=vec2(-0.3,-0.3); //mouse*2.0-1.0;
  166.  
  167.     float spec=dot(l,n);
  168.  
  169.     gl_FragColor=vec4(mix(c,vec3(0.3),spec),1.0);
  170.  
  171. }
Advertisement
Add Comment
Please, Sign In to add comment