surface thirds( float Ks = 0.5, // specular coefficient Kd = 0.5, // diffuse coefficient Ka = .1, // ambient coefficient NoiseAmp = 0.00, // noise amplitude NoiseFreq = 1.00, // noise frequency roughness = 0.1; // specular roughness color SpecularColor = color( 1, 1, 1 ) // specular color ) { float RAMP = 0.5; // over how much of the width to ramp up float TheHeight = 0.; // how much displacement to apply varying vector Nf = faceforward( normalize( N ), I ); vector V = normalize( -I ); point PP = point "shader" P; float magnitude = 0.; float size = 1.; float i; for( i = 0.; i < 6.0; i += 1.0 ) { magnitude += ( .5 - noise( NoiseFreq * size * PP ) ) / size; size *= 2.0; } color TheColor = Cs; float up = 2. * u; float vp = v; float WIDTH = 0.10; float numinu = floor( up / WIDTH ); float numinv = floor( vp / WIDTH ); float ucenter = numinu*WIDTH + WIDTH/2.; float vcenter = numinv*WIDTH + WIDTH/2.; point center = point( ucenter, vcenter, 0. ); point upvp = point( up, vp, 0. ); vector delta = upvp - center; float oldrad = length( delta ); float newrad = oldrad + NoiseAmp*magnitude; float factor = newrad / oldrad; point uppvpp = center + factor * ( delta ); float upp = xcomp(uppvpp); float vpp = ycomp(uppvpp); if( mod( numinu+numinv, 2. ) == 0. ) { float umin = numinu*WIDTH; float umax = umin+WIDTH; float vmin = numinv*WIDTH; float vmax = vmin+WIDTH; float distu = min( upp-umin, umax-upp ); float distv = min( vpp-vmin, vmax-vpp ); float dist = min( distu, distv )/WIDTH; float t = smoothstep( 0., RAMP, dist ); // 0. if dist <= 0., 1. if dist >= RAMP TheHeight = t; // apply the blending } if( TheHeight > 0. ) TheColor = color( 1., .5, 0. ); Oi = Os; // use whatever the rib file gave us Ci = TheColor * Ka * ambient(); Ci = Ci + TheColor * Kd * diffuse(Nf); Ci = Ci + SpecularColor * Ks * specular( Nf, V, roughness ); }