00001 #include "Phong.h"
00002
00003 #include <cmath>
00004
00005 namespace rcrt
00006 {
00007
00008 Phong::Phong(const RGBColor& Kd, const RGBColor& Ks, const float& e)
00009 :BXDF(Ks*(e+2)/(2*M_PI), Kd/M_PI, 0, BXDFType(REFLECTIVE)),n(e)
00010 {
00011 }
00012
00013 Phong::~Phong()
00014 {
00015 }
00016
00017 RGBColor Phong::eval(const Vec3D& wOut, const Vec3D& wInc, const Vec3D& normal) const
00018 {
00019 return kd + evalSpecular(wOut,wInc,normal);
00020 }
00021
00022 RGBColor Phong::evalDiffuse(const Vec3D& wOut, const Vec3D& wInc, const Vec3D& normal) const
00023 {
00024 return kd;
00025 }
00026
00027 RGBColor Phong::evalSpecular(const Vec3D& wOut, const Vec3D& wInc, const Vec3D& normal) const
00028 {
00029 Vec3D refl(wInc.reflect(normal));
00030
00031 float angle = refl * wOut;
00032 if (angle >= 1.0) {
00033 angle = 1.0;
00034 }
00035 return ks * powf(angle, n);
00036 }
00037
00038
00039 bool Phong::specular() const
00040 {
00041 return true;
00042 }
00043
00044 bool Phong::glossy() const
00045 {
00046 return true;
00047 }
00048
00049 bool Phong::diffuse() const
00050 {
00051 return true;
00052 }
00053
00054 bool Phong::fresnel() const
00055 {
00056 return false;
00057 }
00058
00059 float Phong::pdf(const Vec3D& wOut, const Vec3D& wInc, const Vec3D& normal) const
00060 {
00061 float cosO = wOut * normal;
00062 if(cosO < 0) return 0;
00063 Vec3D refl(wInc.reflect(normal));
00064 float angle = refl * wOut;
00065 return (n+1)/(2*M_PI)*powf(angle,n);
00066 }
00067
00068 }