home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / share / k3d / shaders / surface / k3d_supertoon.sl < prev    next >
Encoding:
Text File  |  2008-01-23  |  2.1 KB  |  58 lines

  1. /* SuperToon.sl V1.1    Felipe Esquivel 
  2.  * <felipe@siggraph.org.mx>, abril 2002
  3.  *
  4.  * Toon shader con antialiasing. Modula diffuse mediante escaloneo de modo que
  5.  * no se tenga un degradado en el cambio de color. En su lugar el cambio se
  6.  * hace en tres puntos definidos por lim2, lim3 y lim4. A falta de antialiasing
  7.  * analitico se utiliza delta para determinar el nivel de antialiasing del shader.
  8.  *
  9.  * Toon shader with non-analitic antialiasing (controlled by delta). Difusion is modulated with
  10.  * clamping, the inflection points are lim2, lim3 and lim4. This shader is very cheap, 
  11.  * reason why no border detection is allowed. Now with specular.
  12.  */
  13.  
  14. color splitColor(color valor; float delta; float lim2; float lim3; float lim4;){
  15.   color C = 0;
  16.  
  17.   if(comp(valor, 0) < lim3 - delta){
  18.     C = smoothstep(lim2 - delta, lim2 + delta, comp(valor, 0))* lim2;
  19.   }
  20.   else if(comp(valor, 0) >= lim3 - delta && comp(valor, 0) < lim4 - delta){
  21.     C = lim2 + (smoothstep(lim3 - delta, lim3 + delta, comp(valor, 0))* lim3);
  22.   }
  23.   else if(comp(valor, 0) >= lim4 - delta){
  24.     C = lim3 + (smoothstep(lim4 - delta, lim4, comp(valor, 0))* lim4);
  25.   }
  26.  
  27.   return C;
  28. }
  29.  
  30. surface k3d_supertoon(float Kd = 1,
  31.                         Ks = 0,
  32.                         roughness = 0.5, /* specular roughness */
  33.                         delta = 0.015,   /* antialiasing level */
  34.                         lim2 = 0.3,      /* inflection points  */
  35.                         lim3 = 0.7,
  36.                         lim4 = 1;
  37.                   color specColor = 1;)
  38. {
  39.     normal Nf = normalize(N);
  40.     vector NI = normalize(I);
  41.     color  difusion = 0;
  42.     color  especular = 0;
  43.  
  44.     if(Ks != 0){ /* Some optimization. If the multiplier is zero, why call an expensive function? */
  45.       especular = specular(Nf, -NI, roughness);
  46.       especular = splitColor(especular, delta * 3, lim3, lim4, lim4);
  47.     }
  48.     if(Kd != 0){
  49.       difusion = diffuse(faceforward(Nf, NI, Nf));
  50.       difusion = splitColor(difusion, delta, lim2, lim3, lim4);
  51.     }
  52.     
  53.     Oi = Os;
  54.     Ci = Os * (Cs * Kd * difusion + Ks * especular * specColor);
  55. }
  56.  
  57.  
  58.