00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_MICROFACET_H
00024 #define LUX_MICROFACET_H
00025
00026 #include "lux.h"
00027 #include "bxdf.h"
00028 #include "spectrum.h"
00029
00030 namespace lux
00031 {
00032
00033 class Microfacet : public BxDF {
00034 public:
00035
00036 Microfacet(const SWCSpectrum &reflectance, Fresnel *f,
00037 MicrofacetDistribution *d);
00038 virtual ~Microfacet() { }
00039 virtual void f(const TsPack *tspack, const Vector &wo, const Vector &wi, SWCSpectrum *const f) const;
00040 float G(const Vector &wo, const Vector &wi,
00041 const Vector &wh) const {
00042 const float NdotWh = fabsf(CosTheta(wh));
00043 const float NdotWo = fabsf(CosTheta(wo));
00044 const float NdotWi = fabsf(CosTheta(wi));
00045 const float WOdotWh = AbsDot(wo, wh);
00046 return min(1.f, min((2.f * NdotWh * NdotWo / WOdotWh),
00047 (2.f * NdotWh * NdotWi / WOdotWh)));
00048 }
00049 virtual bool Sample_f(const TsPack *tspack, const Vector &wo, Vector *wi,
00050 float u1, float u2, SWCSpectrum *const f, float *pdf, float *pdfBack = NULL,
00051 bool reverse = false) const;
00052 virtual float Pdf(const TsPack *tspack, const Vector &wo, const Vector &wi) const;
00053 private:
00054
00055 SWCSpectrum R;
00056 MicrofacetDistribution *distribution;
00057 Fresnel *fresnel;
00058 };
00059
00060
00061 }
00062
00063 #endif // LUX_MICROFACET_H
00064