From 8da53c5f262b09756e1a93257cdcd5be25807839 Mon Sep 17 00:00:00 2001 From: ladevieq Date: Mon, 21 Dec 2020 23:13:25 +0100 Subject: Movable and rotatable camera + dielectric materials --- src/dielectric.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/dielectric.cpp (limited to 'src/dielectric.cpp') diff --git a/src/dielectric.cpp b/src/dielectric.cpp new file mode 100644 index 0000000..80ca069 --- /dev/null +++ b/src/dielectric.cpp @@ -0,0 +1,32 @@ +#include "dielectric.hpp" +#include "rt.hpp" +#include "hittable.hpp" + +dielectric::dielectric(double index_of_refraction) + : ior(index_of_refraction) {} + +bool dielectric::scatter(const ray& r, const struct hit_info& info, color& attenuation, ray& scattered) const { + auto unit_direction = r.direction.unit(); + auto refraction_ratio = info.front_face ? (1.0 / ior) : ior; + double cos_theta = fmin(info.normal.dot(-unit_direction), 1.0); + double sin_theta = sqrt(1.0 - cos_theta * cos_theta); + + vec3 direction; + if (refraction_ratio * sin_theta > 1.0 || reflectance(cos_theta, refraction_ratio) > randd()) { + direction = reflect(unit_direction, info.normal); + } else { + direction = refract(unit_direction, info.normal, refraction_ratio); + } + + scattered = ray { info.point, direction }; + attenuation = { 1.0, 1.0, 1.0 }; + + return true; +} + +double dielectric::reflectance(double cosine, double ref_idx) { + // Use Schlick's approximation for reflectance. + auto r0 = (1 - ref_idx) / (1 + ref_idx); + r0 = r0 * r0; + return r0 + (1 - r0) * pow ((1 - cosine), 5); +} -- cgit v1.3