Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!wuarchive!uunet!epicb!billr From: billr@truevision.com (Bill Romanowski) Newsgroups: comp.graphics Subject: a RenderMan shader Message-ID: <1991Jun13.183826.1314@truevision.com> Date: 13 Jun 91 18:38:26 GMT Organization: Truevision Inc., Indianapolis, IN Lines: 134 --- RenderMan "terra" shader and example --- I've been asked for this by a few persons so I thought I'd put it on the net... This is the .sl source for the "terra" planet shader and it's companion displacement shader "terrabump". I've also included a .rib file for an example of how it's used. /* * terra(): a terrforming earth-like shader * (terra's displacement companion is "terrabump") * this is a mutation of pixar's blue marble shader * * - no restrictions on use * bill romanowski * truevision inc. */ surface terra( float Ks = .01, Kd = .4, Ka = .1, roughness = .6, txtscale = 1; /* water to land mass ratio */ color specularcolor = 1) { point PP; /* scaled point in shader space */ float csp; /* color spline parameter */ point Nf; /* forward-facing normal */ point V; /* for specular() */ float pixelsize, twice, scale, weight, turbulence; /* Obtain a forward-facing normal for lighting calculations. */ Nf = faceforward( normalize(N), I); V = normalize(-I); PP = transform("shader", P) * txtscale; pixelsize = sqrt(area(PP)); twice = 2 * pixelsize; turbulence = 0; for (scale = 1; scale > twice; scale /= 2) turbulence += scale * noise(PP/scale); /* Gradual fade out of highest-frequency component near limit */ if (scale > pixelsize) { weight = (scale / pixelsize) - 1; weight = clamp(weight, 0, 1); turbulence += weight * scale * noise(PP/scale); } csp = clamp(4 * turbulence - 3, 0, 1); Ci = color spline(csp, color (.9 ,.9 ,.95), color (.87 ,.87 ,.9), color (.75294 ,.92941 ,.92157), color (.27000 ,.28824 ,.18000 ), /* forest */ color (.40000 ,.29500 ,.25000 ), /* mid */ color (.44000 ,.41010 ,.28100 ), /* land */ color (.35000 ,.30000 ,.28000), color (.30000 ,.35000 ,.26000), color (.25000 ,.40000 ,.23000), color (.20000 ,.42500 ,.21000), color (.40000 ,.35000 ,.16000), /* shore */ color (0.02000, 0.02400, 0.40000), /* water */ color (1., 0., 0.28) /* unused */ ); /* Multiply this color by the diffusely reflected light. */ Ci *= Ka*ambient() + Kd*diffuse(Nf); /* Adjust for opacity. */ Oi = Os; Ci = Ci * Oi; /* Add in specular highlights. */ Ci += specularcolor * Ks * specular(Nf,V,roughness); } /* the end */ /* * terrabump: a terrforming earth-like shader * displacement shader companion to terra shader * * ( remember to set "txtscale" to the same value in * the terra shader so the mountains line up ) * * this is a mutation of pixar's blue marble shader * * - no restrictions on use * bill romanowski * truevision inc. */ displacement terrabump( float depth = 1, txtscale = 1;) /* amount to scale mountains */ { point PP; /* scaled point in shader space */ float csp; /* color spline parameter */ point Nf; /* forward-facing normal */ point V; /* for specular() */ point P2; float pixelsize, twice, scale, weight, turbulence; /* Obtain a forward-facing normal for lighting calculations. */ Nf = faceforward( normalize(N), I); V = normalize(-I); PP = transform("shader", P) * txtscale; pixelsize = sqrt(area(PP)); twice = 2 * pixelsize; turbulence = 0; for (scale = 1; scale > twice; scale /= 2) turbulence += scale * noise(PP/scale); if (scale > pixelsize) { weight = (scale / pixelsize) - 1; weight = clamp(weight, 0, 1); turbulence += weight * scale * noise(PP/scale); } P2 = P + ((clamp(4 * turbulence - 3, -1, 1))*depth); N = calculatenormal(P2); } /* the end */ -----------------------------------------------------------------