/* * backlit.sl * * Lawson Wade * * A surface shader that simulates a translucent * plastic surface by allowing itself to be lit * from behind */ #include "rmannotes.sl" surface backlit( float Ka = 1, Kd = 0.5, Ks = 0.5, roughness = 0.1; color specularcolor = 1; ) { point Nf, V; point Nin, Vmirrored; color surface_color, layer_color; color surface_opac; float count; /* illumination vectors */ Nf = faceforward(normalize(N), I); V = normalize(-I); /*** background layer ***/ surface_opac = Os; surface_color = 0; /*** ambient light ***/ surface_color += Os * Cs * Ka * ambient(); /*** diffuse light from front ***/ surface_color += Os * Cs * Kd * diffuse(Nf); /*** diffuse light from behind ***/ layer_color = 0; Nin = -Nf; illuminance(P, Nin, 0.5*PI) layer_color += Cl * (normalize(L) . Nin); surface_color += Os * layer_color; /*** specular light from front ***/ surface_color += specularcolor * Ks * specular(Nf, V, roughness); /*** specular light from behind ***/ Vmirrored = faceforward(reflect(V, Nf), Nin); surface_color += specularcolor * Ks * specular(Nin, Vmirrored, 1.0); /* output */ Oi = surface_opac; Ci = surface_color; }