Shaders


toon - A shader for cartoon rendering

 
/*  toon.sl - Toon shader for all renderman renderers.
 *  (c) Copyright 1998, Colin Doncaster.
 *  colind@name.net and colind@calibre-dd.com
 *  Tested with BMRT 2.3.6 and PRMan 3.7
 *
 * The RenderMan (R) Interface Procedures and RIB Protocol are:
 *     Copyright 1988, 1989, Pixar.  All rights reserved.
 * RenderMan (R) is a registered trademark of Pixar.
 *
 *  Basically this shader measures the light values and uses Cs and supplied
 *  parameters for building the colour.  Quite simple actually!
 *
 *  Usage:
 *    threshold is used to define how the areas are broken up based on the
 *    diffuse light.
 *    Low and High are used to alter Cs to get the desired shade of Cs.
 *    Variance is used to stop hard edges forming along the colour change,
 *    this is basically used to control the smoothstep between the two colours.
 *    Edges is the colour of the out and inner line colours;
 *    EdgeVal is used to blend the base colour with the edges so it fits
 *    better on the object.
 *
 *    HaveFun!!!!! Colin.
 *
 *    BTW The code probably isn't the greatest, if someone knows some speed
 *    ups, let me know.
 */

surface
toon (float Low = 0.2; float High = 1.1;  float threshold = 0.1; float
   variance = 0.02; color Edges = 0; float EdgeVal = 0.9; )
{
    float Lum = 1;
    color LowC ;
    color HighC ;
    color Ct;
    color border;

    /* normal Nf = faceforward (normalize(N),I); */
    point Nf;
    Nf = faceforward (normalize(N),I);

    Oi = Os;
    Lum = (comp(diffuse(Nf), 0) + comp(diffuse(Nf),1) + comp(diffuse(Nf), 2)) / 3;
    LowC = Cs * float Low;
    HighC = Cs * float High;
    Ci = mix(LowC, HighC, smoothstep(threshold - variance, threshold + variance, Lum));
    border = mix(Ci, Edges, EdgeVal);
    Ci = mix(Ci, border, smoothstep(-2, -1, Nf.I));
}


 





Copyright © 1997 by WebNation
All trademarks are the property of their respective holders

Switch to Standard View