topical media & game development

talk show tell print

graphic-player-10-pixel-mrdoob-shaders-tunnel2.pbk / pbk



  <languageVersion : 1.0;>
  
  kernel NewFilter
  < namespace : "Tunnel 2";
  vendor : "Mr.doob";
  version : 1;
  description : "Tunnel effect 2";
  >
  {
  input image4 src;
  output pixel4 dst;
  
  parameter float2 imgSize
  <
  defaultValue : float2(512.0, 512.0);
  minValue : float2(0.0,0.0);
  maxValue : float2(512.0,512.0);
  >;
  
  parameter float2 center
  <
  defaultValue : float2(256.0, 256.0);
  minValue : float2(0.0,0.0);
  maxValue : float2(512.0,512.0);
  >;
  
  parameter float2 offset;
  
  void evaluatePixel()
  {
  float2 pos = (outCoord() - center) / imgSize;
  
  float pi = 3.141592653589793;
  float a = atan(pos.y,pos.x);
  float r = sqrt(pow(pos.x,2.0)+pow(pos.y,2.0));
  
  float u = 0.0;
  float v = 0.0;
  float w = 0.0;
  
  u += offset.x;
  v += offset.y;
  
  // This is where the magic happens
  
  u += 1.0/(r+.5+.5*sin(5.0*a));
  v += a*3.0/pi;
  w += .6*(r+.5+.5*sin(5.0*a));
  
  // End of the magic
  
  u *= imgSize.x;
  v *= imgSize.y;
  
  if (u < 0.0) u += imgSize.x * ceil(-u / imgSize.x);
  if (v < 0.0) v += imgSize.y * ceil(-v / imgSize.y);
  if (u > imgSize.x) u -= imgSize.x * floor(u / imgSize.x);
  if (v > imgSize.y) v -= imgSize.y * floor(v / imgSize.y);
  
  dst = sampleNearest(src,float2(u, v));
  dst.rgb *= w;
  }
  }
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.