Retroreflective shader

Started by gregsandor, May 11, 2010, 12:32:47 PM

Previous topic - Next topic

dandelO

Quote from: Goms on May 16, 2010, 02:15:03 PM
i think this is the best you will get. you can try to use functions to create a surface that is made from 90° angles...
but this is tricky

Yes, I meant that, too.

dandelO

#16
I've found it impossible. Making tiny 45 degree displacements(90 degree sawtooth pattern) across the surface is the easy part. Applying reflections to it and bouncing light onto it requires very, very high render detail to get acceptable reflection results and I'm not sure the light is being reflected correctly at all, there's a lot of reflection noise even at high detail. I've been playing with this for a few hours now and can't make it work with any simple approach.

Maybe some real function wizardry could be made to take the angle of incidence of the light caster against the surface that could revert it back along the same angle and path it came from. I have no idea, sorry. ???

gregsandor

Quote from: dandelO on May 16, 2010, 07:24:08 PM
I've found it impossible. Making tiny 45 degree displacements(90 degree sawtooth pattern) across the surface is the easy part. Applying reflections to it and bouncing light onto it requires very, very high render detail to get acceptable reflection results, there's a lot of noise. I've been playing with this for a few hours now and can't make it work with my hack and slash approach.

Maybe some real function wizardry could be made to take the angle of incidence of the light caster against the surface that could revert it back along the same angle and path it came from. I have no idea, sorry. ???

Yeah, same here.  I think the solution will employ functions to get the light source direction, and re-rerouting it so that instead of bouncing off at the equal angle, it is returned to the same.

There's a renderman shader at http://www.renderman.org/RMR/Shaders/SHWShaders/SHW_velvet.sl

Maybe the math inside can give some guidance.

/* Renamed to SHW_velvet.sl -- tal AT renderman DOT org */

/*
* velvet.sl -- velvet
*
* DESCRIPTION:
*   An attempt at a velvet surface.
*   This phenomenological model contains three compnents:
*   - A retroreflective lobe (back toward the light source)
*   - Scattering near the horizon, regardless of incident direction
*   - A diffuse color
*
* PARAMETERS:
*   Ks:   controls retroreflective lobe
*   Kd:   scales diffuse color
*   Ka:   ambient component (affects diffuse color only)
*   sheen:   color of retroreflective lobe and horizon scattering
*   roughness: shininess of fabric (controls retroreflection only)
*
* ANTIALIASING: should antialias itself fairly well
*
* AUTHOR: written by Stephen H. Westin, Ford Motor Company
*
* HISTORY:
*    2001.02.01   westin AT graphics DOT cornell DOT edu
*         Fixed retroreflection lobe (sign error); added
*         "backscatter" parameter to control it; added
*         "edginess" parameter to control horizon scatter;
*         defined SQR()
*
* prev modified  28 January 1997 S. H. Westin
*/

#define SQR(A) ((A)*(A))

surface
SHW_velvet (float Ka = 0.05,
             Kd = 0.1,
             Ks = 0.1;
       float backscatter = 0.1,
       edginess = 10;
       color sheen = .25;
       float roughness = .1;
 )
{
 normal Nf;                     /* Normalized normal vector */
 vector V;                      /* Normalized eye vector */
 vector H;                      /* Bisector vector for Phong/Blinn */
 vector Ln;                     /* Normalized vector to light */
 color shiny;                   /* Non-diffuse components */
 float cosine, sine;            /* Components for horizon scatter */

 Nf = faceforward (normalize(N), I);
 V = -normalize (I);

 shiny = 0;
 illuminance ( P, Nf, 1.57079632679489661923 /* Hemisphere */ ) {
   Ln = normalize ( L );
   /* Retroreflective lobe */
   cosine = max ( Ln.V, 0 );
   shiny += pow ( cosine, 1.0/roughness ) * backscatter
     * Cl * sheen;
   /* Horizon scattering */
   cosine = max ( Nf.V, 0 );
   sine = sqrt (1.0-SQR(cosine));
   shiny += pow ( sine, edginess ) * Ln.Nf * Cl * sheen;
 }

 Oi = Os;
 /* Add in diffuse color */
 Ci = Os * (Ka*ambient() + Kd*diffuse(Nf)) * Cs + shiny;

}



goldfarb

I'd do this is something other than terragen...

but...
this /might/ work...
you could render a seperate pass with a light pointing in the same direction as your camera (and animated identically if needed)...

ideally you would want to parent the light to your camera and exclude everything but the signs from the influence of the light...


HTH
--
Michael Goldfarb | Senior Technical Director | SideFX | Toronto | Canada

PabloMack

#19
Here is a reflector I did in Lightwave.  It uses physical geometry as
used in automobile reflectors.  The camera has a glowing green ball
behind it and the reflector is spinning to show how the image of the
ball is returned back to the ball (and camera).  Notice that the angle
of view is best at 90 degrees and is lost at about 60 degrees.  There
is a secondary image that races across the reflector at about 45 degrees.  
This technique will require a lot of geometry.  However, it should be
limited to the reflective surfaces of the signs so it might not be too
excessive.  You might be able to import a LWO and apply a reflective
surface to the little mirrorlets.  

http://www.technoventure.com/Terragen/Reflector.wmv

Tangled-Universe

Did you look at my earlier post here?

http://forums.planetside.co.uk/index.php?topic=9830.msg103045#msg103045

I think this should work. It is a function which returns a value of 1 when a triangle faces the camera directly and 0 when it's 90 degrees off camera.
Modifying this function (with a boolean operator or clamp) should allow you to get "full reflectivity =1", independent of angle to camera, or to get a different buildup when using a clamp.

Cheers,
Martin 

gregsandor

Alright guys, now we're getting some progress.  I appreciate all the ideas here.  Math functions are greek to me, so it is slow going.