/* * Beach ball procedural texture for mapping onto a sphere * * Mark Fontana * Digital Lighting, SP 96 * */ #include "/usr/local/accad/shaders/rmannotes.sl" surface beachball_color(float Ks = 0.4, Kd = 0.6, Ka = 0.1, roughness= 0.1; color specularcolor = 1, color1 = color (1, 0, 0), color2 = color (0, 1, 0), color3 = color (0, 0, 1), color4 = color (1, 1, 0)) { point Nf = faceforward(normalize(N), I); point V = -normalize(I); color surface_color, layer_color; color layer_opac, stripe_opac; float ss, fuzz = 0.0001; surface_color = color (1, 0, 1); /* purple top and bottom caps */ Os = t; ss = repeat(s,3); stripe_opac = pulse(0.07, 0.93, fuzz, t); /* stripe layers */ layer_color = color1; layer_opac = stripe_opac*pulse(0.0, 0.25, fuzz, ss); surface_color = blend(surface_color, layer_color, layer_opac); layer_color = color2; layer_opac = stripe_opac*pulse(0.25, 0.50, fuzz, ss); surface_color = blend(surface_color, layer_color, layer_opac); layer_color = color3; layer_opac = stripe_opac*pulse(0.50, 0.75, fuzz, ss); surface_color = blend(surface_color, layer_color, layer_opac); layer_color = color4; layer_opac = stripe_opac*pulse(0.75, 1.0, fuzz, ss); surface_color = blend(surface_color, layer_color, layer_opac); /* output */ surface_color = surface_color * (Ka * ambient() + Kd * diffuse(Nf)) + specularcolor * Ks * specular(Nf, V, roughness); Oi = Os; Ci = Os * surface_color; }