src/rcrt/bxdf/Phong.cpp

Go to the documentation of this file.
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) {//clamp
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 }

Generated on Thu Jan 31 19:26:19 2008 for RenderingCompetitionRayTracer by  doxygen 1.5.3