/* * my_glow(): a shader for providing a centered "glow" in a sphere * with swirls surrounding */ #include "rmannotes.sl" surface smoke_glow( float attenuation = 5 ) { point NN = normalize(N); point II = normalize(I); float falloff = II.NN; /* Direct incidence has cosine closer to 1.*/ color surface_color, layer_color; color surface_opac, layer_opac; float Ka, Kd, Ks, roughness; color specularcolor; point Nf, V; float fuzz = 0.05; float noi; float freq = 2; float noifreq = 9; float noiscale = 0.8; point PP; float veining = 0.5; float width, cutoff, fade, f, turb, maxfreq = 16; /* init */ Nf = faceforward(normalize(N), I); V = -normalize(I); surface_color = color(1, .894, .768); surface_opac = Os; /* compute turbulence */ PP = transform("shader", P) * veining; width = filterwidth_point(PP); cutoff = clamp(0.5 / width, 0, maxfreq); turb = 0; for (f = 1; f < 0.5 * cutoff; f *= 2) turb += abs(snoise(PP * f)) / f; fade = clamp(2 * (cutoff - f) / cutoff, 0, 1); turb += fade * abs(snoise(PP * f)) / f; turb *= 0.5; layer_color = color (1, .894, .768); layer_opac = pow(1-turb, 8); Ka = 0.5; Kd = 0.4; Ks = .6; roughness = 0.08; specularcolor = color (1, 1, 1); layer_color = layer_color * (Ka * ambient() + Kd * diffuse(Nf)) + specularcolor * Ks * specular(Nf, V, roughness); /* glow */ if (falloff < 0) { /* Normalize falloff by lengths of I and N */ falloff = falloff * falloff / (II.II * NN.NN) ; falloff = pow(falloff, attenuation); surface_color = surface_color * falloff; surface_opac = falloff; } else surface_opac = 0; surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* output */ Oi = surface_opac; Ci = surface_opac * surface_color; }