00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "fresnel.h"
00025 #include "spectrum.h"
00026
00027 using namespace lux;
00028
00029 Fresnel::~Fresnel() { }
00030
00031 namespace lux
00032 {
00033
00034
00035 void FrDiel(float cosi, float cost,
00036 const SWCSpectrum &etai,
00037 const SWCSpectrum &etat,
00038 SWCSpectrum *const f) {
00039 SWCSpectrum Rparl = (etat * cosi - etai * cost) /
00040 (etat * cosi + etai * cost);
00041 SWCSpectrum Rperp = (etai * cosi - etat * cost) /
00042 (etai * cosi + etat * cost);
00043 *f = (Rparl*Rparl + Rperp*Rperp) * 0.5f;
00044 }
00045 void FrDiel2(float cosi, const SWCSpectrum &cost, const SWCSpectrum &eta, SWCSpectrum *f)
00046 {
00047 SWCSpectrum R(eta * cost);
00048 R = (SWCSpectrum(cosi) - R) / (SWCSpectrum(cosi) + R);
00049 R *= R;
00050 *f = R;
00051 }
00052 void FrCond(float cosi,
00053 const SWCSpectrum &eta,
00054 const SWCSpectrum &k,
00055 SWCSpectrum *const f) {
00056 SWCSpectrum tmp = (eta*eta + k*k) * (cosi*cosi) + 1;
00057 SWCSpectrum Rparl2 =
00058 (tmp - (2.f * eta * cosi)) /
00059 (tmp + (2.f * eta * cosi));
00060 SWCSpectrum tmp_f = eta*eta + k*k + (cosi*cosi);
00061 SWCSpectrum Rperp2 =
00062 (tmp_f - (2.f * eta * cosi)) /
00063 (tmp_f + (2.f * eta * cosi));
00064 *f = (Rparl2 + Rperp2) * 0.5f;
00065 }
00066 void FrFull(float cosi, const SWCSpectrum &cost, const SWCSpectrum &eta, const SWCSpectrum &k, SWCSpectrum *f)
00067 {
00068 SWCSpectrum tmp = (eta * eta + k * k) * (cosi * cosi) + (cost * cost);
00069 SWCSpectrum Rparl2 = (tmp - (2.f * cosi * cost) * eta) /
00070 (tmp + (2.f * cosi * cost) * eta);
00071 SWCSpectrum tmp_f = (eta * eta + k * k) * (cost * cost) + (cosi * cosi);
00072 SWCSpectrum Rperp2 = (tmp_f - (2.f * cosi * cost) * eta) /
00073 (tmp_f + (2.f * cosi * cost) * eta);
00074 *f = (Rparl2 + Rperp2) * 0.5f;
00075 }
00076 SWCSpectrum FresnelApproxEta(const SWCSpectrum &Fr) {
00077 SWCSpectrum sqrtReflectance = Fr.Clamp(0.f, .999f).Sqrt();
00078 return (SWCSpectrum(1.) + sqrtReflectance) /
00079 (SWCSpectrum(1.) - sqrtReflectance);
00080 }
00081 SWCSpectrum FresnelApproxK(const SWCSpectrum &Fr) {
00082 SWCSpectrum reflectance = Fr.Clamp(0.f, .999f);
00083 return 2.f * (reflectance /
00084 (SWCSpectrum(1.) - reflectance)).Sqrt();
00085 }
00086
00087 }
00088