Add albedo to material visualization
This commit is contained in:
parent
9195b48079
commit
829476c602
3 changed files with 43 additions and 15 deletions
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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))),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue