home *** CD-ROM | disk | FTP | other *** search
- /* rh_brushedmetal - uses surface color
-
- /* Renamed to LGbrushedmetal for RMR -- tal@cs.caltech.edu */
-
- /*
- * Greg Ward Larson's anisotropic specular local illumination model.
- * The derivation and formulae can be found in: Ward, Gregory J.
- * "Measuring and Modeling Anisotropic Reflection," ACM Computer
- * Graphics 26(2) (Proceedings of Siggraph '92), pp. 265-272, July, 1992.
- * Inputs:
- * N - unit surface normal
- * V - unit viewing direction (from P toward the camera)
- * xdir - a unit tangent of the surface which defines the reference
- * direction for the anisotropy.
- * xroughness - the apparent roughness of the surface in xdir.
- * yroughness - the roughness for the direction of the surface
- * tangent which is perpendicular to xdir.
- */
- color
- LocIllumWardAnisotropic (normal N; vector V;
- vector xdir; float xroughness, yroughness;)
- {
- float sqr (float x) { return x*x; }
-
- float cos_theta_r = clamp (N.V, 0.0001, 1);
- vector X = xdir / xroughness;
- vector Y = (N ^ xdir) / yroughness;
-
- color C = 0;
- extern point P;
- illuminance (P, N, PI/2) {
- /* Must declare because extern L & Cl because we're in a function */
- extern vector L; extern color Cl;
- float nonspec = 0;
- lightsource ("__nonspecular", nonspec);
- if (nonspec < 1) {
- vector LN = normalize (L);
- float cos_theta_i = LN . N;
- if (cos_theta_i > 0.0) {
- vector H = normalize (V + LN);
- float rho = exp (-2 * (sqr(X.H) + sqr(Y.H)) / (1 + H.N))
- / sqrt (cos_theta_i * cos_theta_r);
- C += Cl * ((1-nonspec) * cos_theta_i * rho);
- }
- }
- }
- return C / (4 * xroughness * yroughness);
- }
-
-
-
- surface
- rh_brushedmetal ( float Ka = 1, Kd = 0.1, Ks = .9;
- float uroughness = 0.35, vroughness = 0.2;
- )
- {
- normal Nf = faceforward (normalize(N), I);
- vector xdir = normalize (dPdu);
-
- color spec = LocIllumWardAnisotropic (Nf, -normalize(I),
- xdir, uroughness, vroughness);
- Ci = Cs * (Ka*ambient() + Kd*diffuse(Nf) + Ks*spec);
- Oi = Os; Ci *= Oi;
- }
-
-