Add albedo to material visualization

This commit is contained in:
hal8174 2024-12-31 18:04:52 +01:00
parent 9195b48079
commit 829476c602
3 changed files with 43 additions and 15 deletions

View file

@ -101,3 +101,9 @@ impl Mul<Color> for Float {
Color::new(self * rhs.r, self * rhs.g, self * rhs.b)
}
}
impl std::iter::Sum for Color {
fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
iter.reduce(|a, b| a + b).unwrap_or(Color::black())
}
}

View file

@ -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<dyn std::error::Error>> {
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<M: Material<SmallRng>>(
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::<Color>();
total / (self.inserted as Float)
}
}
impl ParallelExtend<(Dir3, Color)> for Histogram {

View file

@ -16,11 +16,6 @@ use super::ExampleScene;
pub fn scene<R: Rng + Debug + 'static>() -> ExampleScene<R> {
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<R: Rng + Debug + 'static>() -> ExampleScene<R> {
.map(|t| Triangle::new(t.v, 0))
.collect::<Vec<_>>();
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))),