Fresnel.h

Go to the documentation of this file.
00001 
00006 #ifndef FRESNEL_H
00007 #define FRESNEL_H FRESNEL_H
00008 
00009 #include "StdDefs.h"
00010 
00015 class Fresnel {
00016     public:
00017         virtual float Evaluate (float cosi) { 
00018             return 0; 
00019         }
00020 
00021         virtual ~Fresnel () {};
00022 };
00023 
00029 class FresnelDielectric : public Fresnel {
00030     private:
00031     
00036         float eta_i;
00037 
00042         float eta_t;
00043     
00052         float FrDielectric (float cosi, float cost, float etai, float etat) {
00053             float r_par = (etat*cosi - etai*cost) / (etat*cosi + etai*cost);
00054             float r_per = (etai*cosi - etat*cost) / (etai*cosi + etat*cost);
00055             //  Assumption: The light is unpolarised and therefore the Fresnel reflectance is the average
00056             //  of the squares of the parallel and perpendicular polarization term.
00057             return  0.5 * (r_par*r_par + r_per*r_per);
00058         }
00059 
00060     public:
00061         
00062         FresnelDielectric (float ei, float et) : eta_i(ei), eta_t(et) {};
00063         
00064         ~FresnelDielectric() {};    
00065         
00071         float Evaluate (float cosi) {
00072             bool entering = cosi > 0;
00073             float ei = entering ? eta_i : eta_t;
00074             float et = entering ? eta_t : eta_i;
00075             // Compute sint using Snell's law
00076             float sint = ei/et * sqrtf(MAX(0, 1 - cosi*cosi));
00077             if (sint > 1) {
00078                 // Total internal reflection!
00079                 return 1;
00080             } else {
00081                 float cost = sqrtf(MAX(0.f, 1.f - sint*sint));
00082                 return FrDielectric(fabs(cosi), cost, ei, et);
00083             }
00084         }
00085 };
00086 
00092 class FresnelConductor : public Fresnel {
00093     private:
00094     
00099         float eta;
00100 
00105         float kappa;
00106     
00107     public:
00108         FresnelConductor (float e, float k) : eta(e), kappa(k) {};
00109         
00110         ~FresnelConductor () {};    
00111         
00117         float Evaluate (float cosi) {
00118             cosi = fabsf(cosi);
00119             float tmp1 = eta*eta + kappa*kappa;
00120             float tmp2 = cosi * cosi;
00121             float tmp3 = 2.f * eta *cosi;
00122             float rparl2 = (tmp1 * tmp2 - tmp3  + 1) / (tmp1 * tmp2 + tmp3 +1);
00123             float rperp2 = (tmp1 - tmp3 + tmp2) / (tmp1 + tmp3 + tmp2);
00124             return (rparl2 + rperp2) / 2.f;
00125         }
00126 };
00127 
00128 #endif

Generated on Thu Jan 31 21:48:48 2008 for RayTracer by  doxygen 1.5.4