ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cal/cal/WalterBSDF.cal
Revision: 1.1
Committed: Wed Mar 19 19:06:20 2014 UTC (10 years, 1 month ago) by greg
Branch: MAIN
CVS Tags: rad5R4, rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R2P1, rad5R3, HEAD
Log Message:
Created BSDF version of Walter et al.

File Contents

# User Rev Content
1 greg 1.1 { RCSid $Id: WalterBTDF.cal,v 1.1 2014/03/18 16:16:37 greg Exp $ }
2     {
3     Isotropic BSDF model by Walter et al.
4     }
5     { BRDF parameters (change these) }
6     kdinr : 0.;
7     ksinr : 1.;
8     f0r : 0.277605834967475;
9     alpha_r : 0.077419771872748;
10     { BTDF parameters (change these) }
11     ksint : 0.126221381019119;
12     sigma_i : 1.434228082595141;
13     sigma_o : 1.656368055960319;
14     f0t : 0.2;
15     alpha_t : 0.149990535073450;
16    
17     { Useful functions }
18     s(x) : x*x;
19     abs(x) : if(x, x, -x);
20     noneg(x) : if(x, x, 0);
21    
22     { Reflection functions }
23     Gr(x) : 2/(1 + sqrt(1 + s(alpha_r)*(1-s(x))/s(x)));
24     Fr(w) : f0r + (1-f0r)*(1-w)^5;
25     Dr(htn) : s(alpha_r)/PI/s( s(htn)*(s(alpha_r)-1) + 1 );
26    
27     lobe3r(wihr,win,won,htn) : Fr(wihr)*Dr(htn)*Gr(win)*Gr(won) / (4*win*won);
28     lobe2r(ix,iy,iz,ox,oy,oz,htx,hty,htz,nf) : lobe3r((ix*htx+iy*hty+iz*htz)*nf,
29     iz, oz, htz*nf);
30     lobe1r(ix,iy,iz,ox,oy,oz,htx,hty,htz) : lobe2r(ix,iy,iz,ox,oy,oz,htx,hty,htz,
31     1/sqrt(s(htx)+s(hty)+s(htz)));
32    
33     { Transmission functions }
34     Gt(x) : 2/(1 + sqrt(1 + s(alpha_t)*(1-s(x))/s(x)));
35     Ft(w) : f0t + (1-f0t)*(1-w)^5;
36     Dt(htn) : s(alpha_t)/PI/s( s(htn)*(s(alpha_t)-1) + 1 );
37    
38     lobe3t(wiht,woht,win,won,htn) : abs(wiht*woht/(win*won)) *
39     s(sigma_o)*(1-Ft(wiht))*Dt(htn)*Gt(win)*Gt(won) /
40     s(sigma_i*wiht + sigma_o*woht);
41    
42     lobe2t(ix,iy,iz,ox,oy,oz,htx,hty,htz,nf) : lobe3t((ix*htx+iy*hty+iz*htz)*nf,
43     (ox*htx+oy*hty+oz*htz)*nf, iz, oz, htz*nf);
44    
45     lobe1t(ix,iy,iz,ox,oy,oz,htx,hty,htz) : lobe2t(ix,iy,iz,ox,oy,oz,htx,hty,htz,
46     1/sqrt(s(htx)+s(hty)+s(htz)));
47    
48     { Final function call - reflection & transmission }
49     { vectors normalized, pointing away from surface }
50     walter(ix,iy,iz,ox,oy,oz) : if(iz*oz, kdinr/PI +
51     ksinr*lobe1r(ix,iy,iz,ox,oy,oz,
52     ix+ox, iy+oy, iz+oz),
53     ksint*noneg(lobe1t(ix,iy,iz,ox,oy,oz,
54     -sigma_i*ix-sigma_o*ox,
55     -sigma_i*iy-sigma_o*oy,
56     -sigma_i*iz-sigma_o*oz)) );