diff --git a/Makefile b/Makefile index 029e344..3f71a98 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CXX = g++ TARGET = ray -OBJECTS = main.o disk.o plane.o sphere.o directional_light.o point_light.o tracer.o path_tracer.o whitted_tracer.o phong_brdf.o +OBJECTS = main.o disk.o plane.o sphere.o directional_light.o phong_brdf.o point_light.o tracer.o path_tracer.o whitted_tracer.o DEPENDS = $(OBJECTS:.o=.d) CXXFLAGS = -ansi -pedantic -Wall -DGLM_FORCE_RADIANS -fopenmp LDLIBS = -lfreeimage diff --git a/brdf.hpp b/brdf.hpp index 14a54c5..e320fd0 100644 --- a/brdf.hpp +++ b/brdf.hpp @@ -5,7 +5,6 @@ #include #include "ray.hpp" -#include "material.hpp" using glm::vec3; diff --git a/directional_light.cpp b/directional_light.cpp index d069014..26ceb41 100644 --- a/directional_light.cpp +++ b/directional_light.cpp @@ -21,9 +21,9 @@ inline float DirectionalLight::distance(vec3 point) { } vec3 DirectionalLight::diffuse(vec3 normal, Ray & r, vec3 i_pos, Material & m) const { - return m_brdf->diffuse(m_position, normal, r, m_diffuse); + return m.m_brdf->diffuse(m_position, normal, r, m_diffuse); } vec3 DirectionalLight::specular(vec3 normal, Ray & r, vec3 i_pos, Material & m) const { - return m_brdf->specular(m_position, normal, r, m_specular, m.m_shininess); + return m.m_brdf->specular(m_position, normal, r, m_specular, m.m_shininess); } diff --git a/directional_light.hpp b/directional_light.hpp index b008adf..040d756 100644 --- a/directional_light.hpp +++ b/directional_light.hpp @@ -8,7 +8,7 @@ class DirectionalLight: public Light { public: DirectionalLight(): Light() { } - DirectionalLight(BRDF * _brdf, vec3 _p, vec3 _d, vec3 _s): Light(_brdf, _p, _d, _s) { } + DirectionalLight(vec3 _p, vec3 _d, vec3 _s): Light(_p, _d, _s) { } virtual vec3 direction(vec3 point); virtual float distance(vec3 point); diff --git a/light.hpp b/light.hpp index 09866a9..16c42a3 100644 --- a/light.hpp +++ b/light.hpp @@ -4,27 +4,22 @@ #include -#include "brdf.hpp" -#include "phong_brdf.hpp" -#include "ray.hpp" #include "material.hpp" +#include "ray.hpp" using glm::vec3; class Light { public: - BRDF * m_brdf; vec3 m_position; vec3 m_diffuse; vec3 m_specular; - Light(): m_brdf(static_cast(new PhongBRDF())), m_position(vec3(0.0f)), m_diffuse(vec3(1.0f)), m_specular(vec3(1.0f)) { } + Light(): m_position(vec3(0.0f)), m_diffuse(vec3(1.0f)), m_specular(vec3(1.0f)) { } - Light(BRDF * _brdf, vec3 _p, vec3 _d, vec3 _s): m_brdf(_brdf), m_position(_p), m_diffuse(_d), m_specular(_s) { } + Light(vec3 _p, vec3 _d, vec3 _s): m_position(_p), m_diffuse(_d), m_specular(_s) { } - virtual ~Light() { - delete m_brdf; - } + virtual ~Light() { } virtual vec3 direction(vec3 point) = 0; virtual float distance(vec3 point) = 0; diff --git a/main.cpp b/main.cpp index 2d13611..e6733bd 100644 --- a/main.cpp +++ b/main.cpp @@ -88,6 +88,7 @@ int main(int argc, char ** argv) { scene_2(figures, lights, i_model_view); + // Create the tracer object. if (g_tracer == WHITTED) tracer = static_cast(new WhittedTracer(g_h, g_w, g_fov, g_max_depth)); else if(g_tracer == MONTE_CARLO) diff --git a/material.hpp b/material.hpp index 78f4f98..c53c523 100644 --- a/material.hpp +++ b/material.hpp @@ -4,6 +4,9 @@ #include +#include "brdf.hpp" +#include "phong_brdf.hpp" + using glm::vec3; class Material { @@ -14,10 +17,11 @@ public: float m_shininess; float m_ref_index; bool m_refract; - float kd; - float ks; + BRDF * m_brdf; - Material(): m_diffuse(vec3(1.0f)), m_specular(vec3(1.0f)), m_rho(0.0f), m_shininess(89.0f), m_ref_index(1.0f), m_refract(false), kd(0.4f), ks(0.4f) { } + Material(BRDF * _brdf = NULL): m_diffuse(vec3(1.0f)), m_specular(vec3(1.0f)), m_rho(0.0f), m_shininess(89.0f), m_ref_index(1.0f), m_refract(false) { + m_brdf = _brdf != NULL ? _brdf : static_cast(new PhongBRDF()); + } Material(const Material & m) { m_diffuse = m.m_diffuse; @@ -26,6 +30,7 @@ public: m_shininess = m.m_shininess; m_ref_index = m.m_ref_index; m_refract = m.m_refract; + m_brdf = m.m_brdf; } }; diff --git a/output.png b/output.png index 96b8073..11c9573 100644 Binary files a/output.png and b/output.png differ diff --git a/path_tracer.cpp b/path_tracer.cpp index baccbd7..688bdf8 100644 --- a/path_tracer.cpp +++ b/path_tracer.cpp @@ -88,7 +88,7 @@ vec3 PathTracer::trace_ray(Ray & r, vector
& v_figures, vectorm_mat.m_diffuse / pi())) + (_f->m_mat.m_diffuse * dir_spec_color); + color += ((dir_diff_color + ind_color + amb_color) * (_f->m_mat.m_diffuse / pi())) + (_f->m_mat.m_specular * dir_spec_color); // Determine the specular reflection color. if (_f->m_mat.m_rho > 0.0f && rec_level < m_max_depth) { diff --git a/phong_brdf.hpp b/phong_brdf.hpp index fc8cbe9..8e0d833 100644 --- a/phong_brdf.hpp +++ b/phong_brdf.hpp @@ -4,7 +4,7 @@ #include "brdf.hpp" -class PhongBRDF: public BRDF{ +class PhongBRDF: public BRDF { public: PhongBRDF() { } virtual ~PhongBRDF() { } diff --git a/point_light.cpp b/point_light.cpp index 5d07554..aabe96e 100644 --- a/point_light.cpp +++ b/point_light.cpp @@ -28,7 +28,7 @@ vec3 PointLight::diffuse(vec3 normal, Ray & r, vec3 i_pos, Material & m) const { l_dir = normalize(l_dir); att = 1.0f / (m_const_att + (m_lin_att * d) + (m_quad_att * (d * d))); - return att * m_brdf->diffuse(l_dir, normal, r, m_diffuse); + return att * m.m_brdf->diffuse(l_dir, normal, r, m_diffuse); } vec3 PointLight::specular(vec3 normal, Ray & r, vec3 i_pos, Material & m) const { @@ -40,5 +40,5 @@ vec3 PointLight::specular(vec3 normal, Ray & r, vec3 i_pos, Material & m) const l_dir = normalize(l_dir); att = 1.0f / (m_const_att + (m_lin_att * d) + (m_quad_att * (d * d))); - return att * m_brdf->specular(l_dir, normal, r, m_specular, m.m_shininess); + return att * m.m_brdf->specular(l_dir, normal, r, m_specular, m.m_shininess); } diff --git a/point_light.hpp b/point_light.hpp index 93de77a..3685a5c 100644 --- a/point_light.hpp +++ b/point_light.hpp @@ -12,7 +12,7 @@ public: PointLight(): Light(), m_const_att(1.0f), m_lin_att(0.0f), m_quad_att(0.0f) { } - PointLight(BRDF * _brdf, vec3 _p, vec3 _d, vec3 _s, float _c, float _l, float _q): Light(_brdf, _p, _d, _s), m_const_att(_c), m_lin_att(_l), m_quad_att(_q) { } + PointLight(vec3 _p, vec3 _d, vec3 _s, float _c, float _l, float _q): Light(_p, _d, _s), m_const_att(_c), m_lin_att(_l), m_quad_att(_q) { } virtual vec3 direction(vec3 point); virtual float distance(vec3 point); diff --git a/whitted_tracer.cpp b/whitted_tracer.cpp index 0e6f81c..bae60bf 100644 --- a/whitted_tracer.cpp +++ b/whitted_tracer.cpp @@ -55,7 +55,7 @@ vec3 WhittedTracer::trace_ray(Ray & r, vector
& v_figures, vectorspecular(n, r, i_pos, _f->m_mat) : vec3(0.0f); } - color += (dir_diff_color * (_f->m_mat.m_diffuse / pi())) + (_f->m_mat.m_diffuse * dir_spec_color); + color += (dir_diff_color * (_f->m_mat.m_diffuse / pi())) + (_f->m_mat.m_specular * dir_spec_color); // Determine the specular reflection color. if (_f->m_mat.m_rho > 0.0f && rec_level < m_max_depth) {