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.slMaybe 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;
}