Moved BRDF to material definition.
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
|||||||
CXX = g++
|
CXX = g++
|
||||||
TARGET = ray
|
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)
|
DEPENDS = $(OBJECTS:.o=.d)
|
||||||
CXXFLAGS = -ansi -pedantic -Wall -DGLM_FORCE_RADIANS -fopenmp
|
CXXFLAGS = -ansi -pedantic -Wall -DGLM_FORCE_RADIANS -fopenmp
|
||||||
LDLIBS = -lfreeimage
|
LDLIBS = -lfreeimage
|
||||||
|
1
brdf.hpp
1
brdf.hpp
@@ -5,7 +5,6 @@
|
|||||||
#include <glm/vec3.hpp>
|
#include <glm/vec3.hpp>
|
||||||
|
|
||||||
#include "ray.hpp"
|
#include "ray.hpp"
|
||||||
#include "material.hpp"
|
|
||||||
|
|
||||||
using glm::vec3;
|
using glm::vec3;
|
||||||
|
|
||||||
|
@@ -21,9 +21,9 @@ inline float DirectionalLight::distance(vec3 point) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
vec3 DirectionalLight::diffuse(vec3 normal, Ray & r, vec3 i_pos, Material & m) const {
|
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 {
|
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);
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,7 @@ class DirectionalLight: public Light {
|
|||||||
public:
|
public:
|
||||||
DirectionalLight(): Light() { }
|
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 vec3 direction(vec3 point);
|
||||||
virtual float distance(vec3 point);
|
virtual float distance(vec3 point);
|
||||||
|
13
light.hpp
13
light.hpp
@@ -4,27 +4,22 @@
|
|||||||
|
|
||||||
#include <glm/vec3.hpp>
|
#include <glm/vec3.hpp>
|
||||||
|
|
||||||
#include "brdf.hpp"
|
|
||||||
#include "phong_brdf.hpp"
|
|
||||||
#include "ray.hpp"
|
|
||||||
#include "material.hpp"
|
#include "material.hpp"
|
||||||
|
#include "ray.hpp"
|
||||||
|
|
||||||
using glm::vec3;
|
using glm::vec3;
|
||||||
|
|
||||||
class Light {
|
class Light {
|
||||||
public:
|
public:
|
||||||
BRDF * m_brdf;
|
|
||||||
vec3 m_position;
|
vec3 m_position;
|
||||||
vec3 m_diffuse;
|
vec3 m_diffuse;
|
||||||
vec3 m_specular;
|
vec3 m_specular;
|
||||||
|
|
||||||
Light(): m_brdf(static_cast<BRDF *>(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() {
|
virtual ~Light() { }
|
||||||
delete m_brdf;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual vec3 direction(vec3 point) = 0;
|
virtual vec3 direction(vec3 point) = 0;
|
||||||
virtual float distance(vec3 point) = 0;
|
virtual float distance(vec3 point) = 0;
|
||||||
|
1
main.cpp
1
main.cpp
@@ -88,6 +88,7 @@ int main(int argc, char ** argv) {
|
|||||||
|
|
||||||
scene_2(figures, lights, i_model_view);
|
scene_2(figures, lights, i_model_view);
|
||||||
|
|
||||||
|
// Create the tracer object.
|
||||||
if (g_tracer == WHITTED)
|
if (g_tracer == WHITTED)
|
||||||
tracer = static_cast<Tracer *>(new WhittedTracer(g_h, g_w, g_fov, g_max_depth));
|
tracer = static_cast<Tracer *>(new WhittedTracer(g_h, g_w, g_fov, g_max_depth));
|
||||||
else if(g_tracer == MONTE_CARLO)
|
else if(g_tracer == MONTE_CARLO)
|
||||||
|
11
material.hpp
11
material.hpp
@@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
#include <glm/vec3.hpp>
|
#include <glm/vec3.hpp>
|
||||||
|
|
||||||
|
#include "brdf.hpp"
|
||||||
|
#include "phong_brdf.hpp"
|
||||||
|
|
||||||
using glm::vec3;
|
using glm::vec3;
|
||||||
|
|
||||||
class Material {
|
class Material {
|
||||||
@@ -14,10 +17,11 @@ public:
|
|||||||
float m_shininess;
|
float m_shininess;
|
||||||
float m_ref_index;
|
float m_ref_index;
|
||||||
bool m_refract;
|
bool m_refract;
|
||||||
float kd;
|
BRDF * m_brdf;
|
||||||
float ks;
|
|
||||||
|
|
||||||
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<BRDF *>(new PhongBRDF());
|
||||||
|
}
|
||||||
|
|
||||||
Material(const Material & m) {
|
Material(const Material & m) {
|
||||||
m_diffuse = m.m_diffuse;
|
m_diffuse = m.m_diffuse;
|
||||||
@@ -26,6 +30,7 @@ public:
|
|||||||
m_shininess = m.m_shininess;
|
m_shininess = m.m_shininess;
|
||||||
m_ref_index = m.m_ref_index;
|
m_ref_index = m.m_ref_index;
|
||||||
m_refract = m.m_refract;
|
m_refract = m.m_refract;
|
||||||
|
m_brdf = m.m_brdf;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
BIN
output.png
BIN
output.png
Binary file not shown.
Before Width: | Height: | Size: 542 KiB After Width: | Height: | Size: 545 KiB |
@@ -88,7 +88,7 @@ vec3 PathTracer::trace_ray(Ray & r, vector<Figure *> & v_figures, vector<Light *
|
|||||||
amb_color = vis ? BCKG_COLOR * max(dot(n, rr.m_direction), 0.0f) / PDF : vec3(0.0f);
|
amb_color = vis ? BCKG_COLOR * max(dot(n, rr.m_direction), 0.0f) / PDF : vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
color += ((dir_diff_color + ind_color + amb_color) * (_f->m_mat.m_diffuse / pi<float>())) + (_f->m_mat.m_diffuse * dir_spec_color);
|
color += ((dir_diff_color + ind_color + amb_color) * (_f->m_mat.m_diffuse / pi<float>())) + (_f->m_mat.m_specular * dir_spec_color);
|
||||||
|
|
||||||
// Determine the specular reflection color.
|
// Determine the specular reflection color.
|
||||||
if (_f->m_mat.m_rho > 0.0f && rec_level < m_max_depth) {
|
if (_f->m_mat.m_rho > 0.0f && rec_level < m_max_depth) {
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include "brdf.hpp"
|
#include "brdf.hpp"
|
||||||
|
|
||||||
class PhongBRDF: public BRDF{
|
class PhongBRDF: public BRDF {
|
||||||
public:
|
public:
|
||||||
PhongBRDF() { }
|
PhongBRDF() { }
|
||||||
virtual ~PhongBRDF() { }
|
virtual ~PhongBRDF() { }
|
||||||
|
@@ -28,7 +28,7 @@ vec3 PointLight::diffuse(vec3 normal, Ray & r, vec3 i_pos, Material & m) const {
|
|||||||
l_dir = normalize(l_dir);
|
l_dir = normalize(l_dir);
|
||||||
att = 1.0f / (m_const_att + (m_lin_att * d) + (m_quad_att * (d * d)));
|
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 {
|
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);
|
l_dir = normalize(l_dir);
|
||||||
att = 1.0f / (m_const_att + (m_lin_att * d) + (m_quad_att * (d * d)));
|
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);
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,7 @@ public:
|
|||||||
|
|
||||||
PointLight(): Light(), m_const_att(1.0f), m_lin_att(0.0f), m_quad_att(0.0f) { }
|
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 vec3 direction(vec3 point);
|
||||||
virtual float distance(vec3 point);
|
virtual float distance(vec3 point);
|
||||||
|
@@ -55,7 +55,7 @@ vec3 WhittedTracer::trace_ray(Ray & r, vector<Figure *> & v_figures, vector<Ligh
|
|||||||
dir_spec_color += vis ? v_lights[l]->specular(n, r, i_pos, _f->m_mat) : vec3(0.0f);
|
dir_spec_color += vis ? v_lights[l]->specular(n, r, i_pos, _f->m_mat) : vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
color += (dir_diff_color * (_f->m_mat.m_diffuse / pi<float>())) + (_f->m_mat.m_diffuse * dir_spec_color);
|
color += (dir_diff_color * (_f->m_mat.m_diffuse / pi<float>())) + (_f->m_mat.m_specular * dir_spec_color);
|
||||||
|
|
||||||
// Determine the specular reflection color.
|
// Determine the specular reflection color.
|
||||||
if (_f->m_mat.m_rho > 0.0f && rec_level < m_max_depth) {
|
if (_f->m_mat.m_rho > 0.0f && rec_level < m_max_depth) {
|
||||||
|
Reference in New Issue
Block a user