summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--main_simple_scanner.cpp16
-rw-r--r--material_dielectric.cpp22
-rw-r--r--material_dielectric.h18
4 files changed, 57 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2ed3de8..a197031 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,9 +12,9 @@ set(CMAKE_VERBOSE_MAKEFILE on)
# main executable
-add_executable(rt main.cpp vec.h bitmap.h ray.h bitfont.h hitlist.h object.h sphere.h viewport.h aa.h material.h material_diffusive.h material_diffusive.cpp material_reflective.h material_reflective.cpp)
+add_executable(rt main.cpp vec.h bitmap.h ray.h bitfont.h hitlist.h object.h sphere.h viewport.h aa.h material.h material_diffusive.h material_diffusive.cpp material_reflective.h material_reflective.cpp material_dielectric.cpp material_dielectric.h)
add_executable(image_output main_image_output.cpp vec.h bitmap.h bitfont.h hitlist.h object.h sphere.h viewport.h)
-add_executable(simple_scanner main_simple_scanner.cpp vec.h bitmap.h ray.h timer.h bitfont.h hitlist.h object.h sphere.h viewport.h aa.h material.h material_diffusive.h material_diffusive.cpp material_reflective.h material_reflective.cpp)
+add_executable(simple_scanner main_simple_scanner.cpp vec.h bitmap.h ray.h timer.h bitfont.h hitlist.h object.h sphere.h viewport.h aa.h material.h material_diffusive.h material_diffusive.cpp material_reflective.h material_reflective.cpp material_dielectric.cpp material_dielectric.h)
# googletest
diff --git a/main_simple_scanner.cpp b/main_simple_scanner.cpp
index b116933..6e79293 100644
--- a/main_simple_scanner.cpp
+++ b/main_simple_scanner.cpp
@@ -16,10 +16,12 @@
#include "aa.h"
#include "material_diffusive.h"
#include "material_reflective.h"
+#include "material_dielectric.h"
// Select the scene to render
//#define SCENE_DIFFUSE
-#define SCENE_REFLECT
+//#define SCENE_REFLECT
+#define SCENE_DIALECT
// T: intermediate color depth
template<typename T>
@@ -59,6 +61,18 @@ void generate_image(uint16_t image_width, uint16_t image_height, double viewport
world.add_object(std::make_shared<sphere>(vec3d{0.0, 0.0, -1.0}, 0.5, m_ball_center));
world.add_object(std::make_shared<sphere>(vec3d{1.0, 0.0, -1.0}, 0.5, m_ball_right));
#endif
+#ifdef SCENE_DIALECT
+ material_diffuse_lambertian m_ground{{0.8, 0.8, 0.0}};
+ material_diffuse_lambertian m_ball_center{{0.7, 0.3, 0.3}};
+ material_dielectric m_ball_left{1.5};
+ material_reflective m_ball_right{{0.8, 0.6, 0.2}};
+ // the earth
+ world.add_object(std::make_shared<sphere>(vec3d{0.0, -100.5, -1.0}, 100.0, m_ground));
+ // three balls
+ world.add_object(std::make_shared<sphere>(vec3d{-1.0, 0.0, -1.0}, 0.5, m_ball_left));
+ world.add_object(std::make_shared<sphere>(vec3d{0.0, 0.0, -1.0}, 0.5, m_ball_center));
+ world.add_object(std::make_shared<sphere>(vec3d{1.0, 0.0, -1.0}, 0.5, m_ball_right));
+#endif
timer tm;
std::cerr << "Rendering..." << std::endl;
tm.start_measure();
diff --git a/material_dielectric.cpp b/material_dielectric.cpp
new file mode 100644
index 0000000..3aaf259
--- /dev/null
+++ b/material_dielectric.cpp
@@ -0,0 +1,22 @@
+//
+// Created by Keuin on 2022/4/15.
+//
+
+#include "material_dielectric.h"
+
+bool material_dielectric::scatter(ray3d &r, const object &hit_obj, double hit_t, random_uv_gen_3d &ruvg) const {
+ const auto hit_p = r.at(hit_t);
+ assert(hit_obj.is_on(hit_p));
+ auto n = hit_obj.normal_vector(hit_p);
+ auto ri_ = ri_inv;
+ if (dot(r.direction(), n) > 0) {
+ // the ray is started from the object's inner,
+ // use normal vector and ri on the surface's inner side
+ n = -n;
+ ri_ = 1.0 / ri_;
+ }
+ const auto r2 = n.refract<true>(r.direction(), ri_); // refracted vector
+ r.direction(r2.unit_vec());
+ r.source(hit_p);
+ return true;
+}
diff --git a/material_dielectric.h b/material_dielectric.h
new file mode 100644
index 0000000..48382b4
--- /dev/null
+++ b/material_dielectric.h
@@ -0,0 +1,18 @@
+//
+// Created by Keuin on 2022/4/15.
+//
+
+#ifndef RT_MATERIAL_DIELECTRIC_H
+#define RT_MATERIAL_DIELECTRIC_H
+
+#include "vec.h"
+#include "material.h"
+
+class material_dielectric : public material {
+ double ri_inv;
+public:
+ explicit material_dielectric(double ri) : ri_inv{1.0 / ri} {}
+ bool scatter(ray3d &r, const object &hit_obj, double hit_t, random_uv_gen_3d &ruvg) const override;
+};
+
+#endif //RT_MATERIAL_DIELECTRIC_H