home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / Shaders / LGShaders / LGGreenMarble.sl < prev    next >
Encoding:
Text File  |  1995-03-22  |  2.5 KB  |  96 lines

  1. /*
  2.  * greenmarble.sl -- RenderMan compatible shader for green veined marble.
  3.  *
  4.  * DESCRIPTION:
  5.  *   Makes a marble-like surface using a turbulence function.
  6.  *   
  7.  * 
  8.  * PARAMETERS:
  9.  *   Ka, Kd, Ks, roughness, specularcolor - work just like the plastic
  10.  *   txtscale - overall scaling for the texture
  11.  *   darkcolor, lightcolor - colors of the underlying substrate
  12.  *   veincolor - color of the bright veins
  13.  *   veinfreq - controls the frequency of the veining effects
  14.  *   sharpness - how sharp the veins appear
  15.  *
  16.  *
  17.  * AUTHOR: Larry Gritz, the George Washington University
  18.  *         email: gritz@seas.gwu.edu
  19.  *
  20.  *
  21.  * last modified  11 July 1994 by Larry Gritz
  22.  */
  23.  
  24.  
  25.  
  26. surface
  27. LGGreenMarble (float Ka = 0.1, Kd = 0.6, Ks = 0.4, roughness = 0.01;
  28.          color specularcolor = 1;
  29.          color darkcolor = color(0.01, 0.12, 0.004);
  30.          color lightcolor = color(0.06, 0.18, 0.02);
  31.          color veincolor = color(0.47, 0.57, 0.03);
  32.          float veinfreq = 1;
  33.          float sharpness = 25;
  34.             )
  35. {
  36. #define snoise(x) (2*noise(x)-1)
  37.   point PP, offset;
  38.   float cmi;
  39.   point Nf, V;
  40.   color Ct;
  41.   float pixelsize, twice, scale, freq;
  42.   float turbsum, turb, i;
  43.  
  44.   PP = transform ("shader", P);
  45.  
  46.   /*
  47.    * First calculate the underlying color of the substrate
  48.    *    Use turbulence - use frequency clamping
  49.    */
  50.   pixelsize = sqrt(area(PP));
  51.   twice = 2 * pixelsize;
  52.   turb = 0;
  53.   for (scale = 1; scale > twice; scale /= 2)
  54.       turb += scale * abs(noise(PP/scale)-0.5);
  55.   if (scale > pixelsize)
  56.       turb += clamp ((scale/pixelsize)-1, 0, 1) * scale * abs(noise(PP/scale)-0.5);
  57.  
  58.   Ct = mix (darkcolor, lightcolor, smoothstep(0.1,.35,turb));
  59.  
  60.   /*
  61.    * Now we layer on the veins
  62.    */
  63.  
  64.   /* perturb the lookup */
  65.   freq = 1;
  66.   offset = point(35.2,-21.9,6.25);
  67.   /* This offset makes it uncorrelated to the substrate pattern */
  68.   for (i = 0;  i < 6;  i += 1) {
  69.       offset += (point noise (freq * PP) - point(.5,.5,.5))  / freq;
  70.       freq *= 2;
  71.     }
  72.   PP += offset;
  73.  
  74.   /* Now calculate the veining function for the lookup area */
  75.   turbsum = 0;  freq = 1;
  76.   PP *= veinfreq;
  77.   for (i = 0;  i < 3;  i += 1) {
  78.       turb = abs (snoise (PP*freq));
  79.       turb = pow (smoothstep (0.8, 1, 1 - turb), sharpness) / freq;
  80.       turbsum += (1-turbsum) * turb;
  81.       freq *= 2;
  82.     }
  83.   turbsum *= smoothstep (-0.1, 0.05, snoise(2*(PP+point(-4.4,8.34,27.1))));
  84.  
  85.   Ct = mix (Ct, veincolor, turbsum);
  86.   
  87.   /*
  88.    * Shade like plastic
  89.    */
  90.   Oi = Os;
  91.   Nf = faceforward (normalize(N), I);
  92.   V = -normalize (I);
  93.   Ci = Os * (Ct * (Ka*ambient() + Kd*diffuse(Nf)) +
  94.          specularcolor * Ks * specular(Nf,V,roughness));
  95. }
  96.