/* * Surface Shader * M. Geroch, Spring 1996 * leafcolors colors the veins in the leaf and also does * autumn coloring */ #include "/usr/local/accad/shaders/rmannotes.sl" surface leafcolor( float vein_freq = 8; color vein_color = color (0.0, 0.303, 0.015); color autumn_color = color (0.545, 0.270, 0.074); float autumn_left = 0.5; float Ks = 0.0, Kd = 0.2, Ka = 1, roughness = 1; color specularcolor = 1;) { point Nf, V; color layer_opac, surface_color, surface_opac; float ss, tt; float fuzz = 0.02, d, dd; float stretch_fac, autumn_opac; surface_color = Cs; surface_opac = Os; Nf = faceforward( normalize(N), I ); V = -normalize(I); /* making autumn colors */ if (autumn_left < 1.0 ) { autumn_opac = noise(s*5, t*5); stretch_fac = 1.0 / (1 - autumn_left); layer_opac = (max(autumn_left, autumn_opac) - autumn_left)*stretch_fac; surface_color = blend(surface_color, autumn_color, layer_opac); } /* main stem layer */ layer_opac = pulse(0.49, 0.52, fuzz, s); surface_color = blend(surface_color, vein_color, layer_opac); /* vein layer */ tt = pow(t, 0.25); tt = repeat(tt, vein_freq * 2); ss = repeat(s, 2); if (s < 0.5) { d = ptlined((0, 0, 0), (1, 1, 0), (ss, tt, 0)) * pow(1.0-ss, 0.25); dd = 0.1 - (0.4 * (tt - 0.5) * (tt - 0.5)) - ss; } else { d = ptlined((1, 0, 0), (0, 1, 0), (ss, tt, 0)) * pow(ss, 0.25); dd = ss - (0.4 * (tt - 0.5) * (tt - 0.5)) - 0.9; } layer_opac = 1 - smoothstep(0.06-fuzz, 0.06, d); surface_color = blend(surface_color, vein_color, layer_opac); surface_opac = 1 - smoothstep(0.0-fuzz, 0.0+fuzz, dd); /* spores layer */ layer_opac = smoothstep(0.75, 0.75+fuzz, noise(s*30, t*30)); surface_color = blend(surface_color, 0.2*Cs, layer_opac); /* final layer */ Ci = surface_opac * (surface_color * (Ka * ambient() + Kd * diffuse(Nf)) + specularcolor * Ks * specular(Nf, V, roughness)); Oi = surface_opac; }