From 829476c602bba7e76e261751f0b6a539830b9bab Mon Sep 17 00:00:00 2001 From: hal8174 Date: Tue, 31 Dec 2024 18:04:52 +0100 Subject: [PATCH] Add albedo to material visualization --- ray-tracing-core/src/color.rs | 6 +++ ray-tracing-material-visualizer/src/main.rs | 44 +++++++++++++++---- .../src/examples/stanford_dragon.rs | 8 +--- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/ray-tracing-core/src/color.rs b/ray-tracing-core/src/color.rs index 3756b77..8e52159 100644 --- a/ray-tracing-core/src/color.rs +++ b/ray-tracing-core/src/color.rs @@ -101,3 +101,9 @@ impl Mul for Float { Color::new(self * rhs.r, self * rhs.g, self * rhs.b) } } + +impl std::iter::Sum for Color { + fn sum>(iter: I) -> Self { + iter.reduce(|a, b| a + b).unwrap_or(Color::black()) + } +} diff --git a/ray-tracing-material-visualizer/src/main.rs b/ray-tracing-material-visualizer/src/main.rs index 2dbd129..d536963 100644 --- a/ray-tracing-material-visualizer/src/main.rs +++ b/ray-tracing-material-visualizer/src/main.rs @@ -14,24 +14,26 @@ use ray_tracing_material::{ mirror::Mirror, oren_nayar::OrenNayar, }; -use rayon::iter::{IntoParallelIterator, ParallelExtend, ParallelIterator}; +use rayon::iter::{ + IntoParallelIterator, IntoParallelRefIterator, ParallelExtend, ParallelIterator, +}; fn main() -> Result<(), Box> { let w_in = Dir3::new(1.0, 1.0, 0.0).normalize(); let color = Color::new(1.0, 1.0, 1.0); - // let m = Mirror::new(color); - // generate_chart("mirror.png", &m, 2, w_in)?; + let m = Mirror::new(color); + generate_chart("mirror.png", &m, 2, w_in)?; - // let m = DiffuseMaterial::new(color); - // generate_chart("diffuse.png", &m, 100, w_in)?; + let m = DiffuseMaterial::new(color); + generate_chart("diffuse.png", &m, 100, w_in)?; let m = Microfacet::new(BeckmannDistribution::new(0.1), color); generate_chart("microfacet.png", &m, 100, w_in)?; - // let m = OrenNayar::new(0.5, color); - // generate_chart("oren-nayar.png", &m, 100, w_in)?; + let m = OrenNayar::new(0.5, color); + generate_chart("oren-nayar.png", &m, 100, w_in)?; Ok(()) } @@ -59,10 +61,28 @@ fn generate_chart>( Float::MIN_POSITIVE, ); - let area = areas[0].titled("Evaled", ("sans-serif", 30))?; + let eval_energy = eval_histogram.energy(); + let area = areas[0].titled( + &format!( + "Evaled ({:.4}, {:.4}, {:.4})", + eval_energy.r(), + eval_energy.g(), + eval_energy.b() + ), + ("sans-serif", 30), + )?; plot_material(&area, eval_histogram, max)?; - let area = areas[1].titled("Sampled", ("sans-serif", 30))?; + let sample_energy = sample_histogram.energy(); + let area = areas[1].titled( + &format!( + "Evaled ({:.4}, {:.4}, {:.4})", + sample_energy.r(), + sample_energy.g(), + sample_energy.b() + ), + ("sans-serif", 30), + )?; plot_material(&area, sample_histogram, max)?; root.present()?; @@ -240,6 +260,12 @@ impl Histogram { }) .filter(|(dir, _)| dir.x() * dir.x() + dir.z() * dir.z() < 1.0) } + + fn energy(&self) -> Color { + let total = self.data.par_iter().copied().sum::(); + + total / (self.inserted as Float) + } } impl ParallelExtend<(Dir3, Color)> for Histogram { diff --git a/ray-tracing-scene/src/examples/stanford_dragon.rs b/ray-tracing-scene/src/examples/stanford_dragon.rs index d49b237..f7cee2c 100644 --- a/ray-tracing-scene/src/examples/stanford_dragon.rs +++ b/ray-tracing-scene/src/examples/stanford_dragon.rs @@ -16,11 +16,6 @@ use super::ExampleScene; pub fn scene() -> ExampleScene { let f = || { - let color = Color::new(0.2, 0.2, 0.9); - // let m = DiffuseMaterial::new(color); - let m = Microfacet::new(BeckmannDistribution::new(0.1), color); - // let m = OrenNayar::new(0.5, color); - let obj = ObjData::new("ray-tracing-scene/obj/stanford_dragon.obj").unwrap(); let mut triangles = obj @@ -28,8 +23,9 @@ pub fn scene() -> ExampleScene { .map(|t| Triangle::new(t.v, 0)) .collect::>(); + let color = Color::new(0.2, 0.2, 0.9); let materials = vec![ - BVHMaterial::new_material(m), + BVHMaterial::new_material(Microfacet::new(BeckmannDistribution::new(0.01), color)), BVHMaterial::new_material(OrenNayar::new(0.5, Color::new(0.8, 0.8, 0.8))), BVHMaterial::new_material(OrenNayar::new(0.5, Color::new(0.9, 0.0, 0.0))), BVHMaterial::new_material(OrenNayar::new(0.5, Color::new(0.0, 0.9, 0.0))),