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
00056
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
00076 float sint = ei/et * sqrtf(MAX(0, 1 - cosi*cosi));
00077 if (sint > 1) {
00078
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