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

# Content
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)) );