fixed reflectance in Dielectric

This commit is contained in:
Moritz Gmeiner 2023-12-31 13:47:03 +01:00
commit d49e7d0300

View file

@ -86,17 +86,18 @@ class Dielectric : public Material {
Vec3 out_dir; Vec3 out_dir;
// Schlick approximation
constexpr auto reflectance = [](f64 cos, f64 eta) { constexpr auto reflectance = [](f64 cos, f64 eta) {
auto r0 = (1 - eta) / (1 + eta); auto r = (1 - eta) / (1 + eta);
r0 = r0 * r0; f64 r2 = r * r;
return r0 * (1 - r0) * std::pow(1 - cos, 5); return r2 + (1 - r2) * std::pow(1 - cos, 5);
}; };
if (eta * sin_theta > 1.0 || reflectance(cos_theta, eta) > rand.GenUniform()) { if (eta * sin_theta > 1.0 || reflectance(cos_theta, eta) > rand.GenUniform()) {
// can't refract, must reflect or Schlick approximation // reflect
out_dir = in.direction().reflect(hit_record.normal); out_dir = in.direction().reflect(hit_record.normal);
} else { } else {
// reflect // refract
out_dir = in.direction().refract(hit_record.normal, eta); out_dir = in.direction().refract(hit_record.normal, eta);
} }