From 681fa9c8230a418457f9df967687da6665d51829 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Sat, 7 Jan 2017 21:42:50 -0400 Subject: [PATCH] Reflective materials have lightning now. --- main.cpp | 4 ++-- path_tracer.cpp | 29 +++++++++++++++++------------ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/main.cpp b/main.cpp index 02d3895..a6ac8e0 100644 --- a/main.cpp +++ b/main.cpp @@ -264,8 +264,8 @@ static void scene_2(vector
& vf, vector & vl, mat4x4 & i_mode vf.push_back(static_cast
(p)); s = new Sphere(-0.5f, -0.5f, -1.5f, 0.5f); - s->m_mat.m_diffuse = vec3(1.0f, 1.0f, 0.0f); - s->m_mat.m_rho = 0.9f; + s->m_mat.m_diffuse = vec3(1.0f); + s->m_mat.m_rho = 0.4f; vf.push_back(static_cast
(s)); s = new Sphere(-0.5f, -0.5f, 0.6f, 0.5f); diff --git a/path_tracer.cpp b/path_tracer.cpp index c3b325d..7374db8 100644 --- a/path_tracer.cpp +++ b/path_tracer.cpp @@ -9,6 +9,8 @@ using namespace glm; PathTracer::~PathTracer() { } +static const float PDF = (1.0f / (2.0f * pi())); + vec3 PathTracer::trace_ray(Ray & r, vector
& v_figures, vector & v_lights, unsigned int rec_level) const { float t, _t; Figure * _f; @@ -35,7 +37,7 @@ vec3 PathTracer::trace_ray(Ray & r, vector
& v_figures, vectornormal_at_int(r, t); // Check if the material is not reflective/refractive. - if( !_f->m_mat.m_refract && _f->m_mat.m_rho == 0.0f) { + if( !_f->m_mat.m_refract) { // Calculate the direct lighting. for (size_t l = 0; l < v_lights.size(); l++) { // For every light source @@ -62,30 +64,33 @@ vec3 PathTracer::trace_ray(Ray & r, vector
& v_figures, vector())); + ind_color += r1 * trace_ray(rr, v_figures, v_lights, rec_level + 1) / PDF; } color += ((dir_diff_color + ind_color) * (_f->m_mat.m_diffuse / pi())) + dir_spec_color; - } else { - // If the material has reflection/transmission enabled. - // Calculate the Fresnel term if the surface is refracting. - if (_f->m_mat.m_refract) - kr = fresnel(r.m_direction, n, r.m_ref_index, _f->m_mat.m_ref_index); - else - kr = _f->m_mat.m_rho; + // Determine the specular reflection color. + if (_f->m_mat.m_rho > 0.0f && rec_level < MAX_RECURSION) { + rr = Ray(normalize(reflect(r.m_direction, n)), i_pos + n * BIAS); + color += _f->m_mat.m_rho * trace_ray(rr, v_figures, v_lights, rec_level + 1); + } else if (_f->m_mat.m_rho > 0.0f && rec_level >= MAX_RECURSION) + return vec3(0.0f); - // Determinte the specular reflection color. + } else { + // If the material has transmission enabled, calculate the Fresnel term. + kr = fresnel(r.m_direction, n, r.m_ref_index, _f->m_mat.m_ref_index); + + // Determine the specular reflection color. if (kr > 0.0f && rec_level < MAX_RECURSION) { rr = Ray(normalize(reflect(r.m_direction, n)), i_pos + n * BIAS); - color += _f->m_mat.m_rho * kr * trace_ray(rr, v_figures, v_lights, rec_level + 1); + color += kr * trace_ray(rr, v_figures, v_lights, rec_level + 1); } else if (rec_level >= MAX_RECURSION) return vec3(0.0f); // Determine the transmission color. if (_f->m_mat.m_refract && kr < 1.0f && rec_level < MAX_RECURSION) { rr = Ray(normalize(refract(r.m_direction, n, r.m_ref_index / _f->m_mat.m_ref_index)), i_pos - n * BIAS, _f->m_mat.m_ref_index); - color += (1.0f - _f->m_mat.m_rho) * (1.0f - kr) * trace_ray(rr, v_figures, v_lights, rec_level + 1); + color += (1.0f - kr) * trace_ray(rr, v_figures, v_lights, rec_level + 1); } else if (rec_level >= MAX_RECURSION) return vec3(0.0f);