diff --git a/ray-tracing-material-visualizer/src/main.rs b/ray-tracing-material-visualizer/src/main.rs index 407a75d..2dbd129 100644 --- a/ray-tracing-material-visualizer/src/main.rs +++ b/ray-tracing-material-visualizer/src/main.rs @@ -28,7 +28,7 @@ fn main() -> Result<(), Box> { // generate_chart("diffuse.png", &m, 100, w_in)?; let m = Microfacet::new(BeckmannDistribution::new(0.1), color); - generate_chart("microfacet.png", &m, 400, w_in)?; + generate_chart("microfacet.png", &m, 100, w_in)?; // let m = OrenNayar::new(0.5, color); // generate_chart("oren-nayar.png", &m, 100, w_in)?; diff --git a/ray-tracing-material/src/microfacet.rs b/ray-tracing-material/src/microfacet.rs index 1a82080..94e6259 100644 --- a/ray-tracing-material/src/microfacet.rs +++ b/ray-tracing-material/src/microfacet.rs @@ -30,7 +30,7 @@ pub fn fresnel_real(cos_theta_in: Float, nu1: Float, nu2: Float) -> Float { impl Material for Microfacet { fn eval(&self, w_in: Dir3, w_out: Dir3, _rng: &mut R) -> ray_tracing_core::prelude::Color { - if w_out.y() > 0.0 { + if w_out.y() > 0.0 && w_in.y() > 0.0 { let w_h = (w_in + w_out).normalize(); let g = self.dist.g1(w_in, w_h) * self.dist.g1(w_out, w_h); diff --git a/ray-tracing-scene/src/examples/stanford_dragon.rs b/ray-tracing-scene/src/examples/stanford_dragon.rs index 76f8c1b..d49b237 100644 --- a/ray-tracing-scene/src/examples/stanford_dragon.rs +++ b/ray-tracing-scene/src/examples/stanford_dragon.rs @@ -18,8 +18,8 @@ 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.5), color); - let m = OrenNayar::new(0.5, 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(); @@ -30,27 +30,49 @@ pub fn scene() -> ExampleScene { let materials = vec![ BVHMaterial::new_material(m), + 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))), BVHMaterial::new_light(AreaLight::new(Color::white() * 30.0)), ]; let mut vertices = obj.vertices; for v in &mut vertices { - *v = Pos3::new(v.x(), v.z(), -v.y()); + *v = Pos3::new(v.x(), v.z() + 60.0, -v.y()); } - let y_pos = 400.0; + let side_length = 400.0; let light_size = 150.0; + let light_offset = 0.01; let offset = vertices.len() as u32; vertices.extend_from_slice(&[ - Pos3::new(light_size, y_pos, light_size), - Pos3::new(light_size, y_pos, -light_size), - Pos3::new(-light_size, y_pos, light_size), - Pos3::new(-light_size, y_pos, -light_size), + Pos3::new(side_length, 2.0 * side_length, side_length), + Pos3::new(side_length, 2.0 * side_length, -side_length), + Pos3::new(side_length, 0.0, side_length), + Pos3::new(side_length, 0.0, -side_length), + Pos3::new(-side_length, 2.0 * side_length, side_length), + Pos3::new(-side_length, 2.0 * side_length, -side_length), + Pos3::new(-side_length, 0.0, side_length), + Pos3::new(-side_length, 0.0, -side_length), + Pos3::new(light_size, 2.0 * side_length - light_offset, light_size), + Pos3::new(light_size, 2.0 * side_length - light_offset, -light_size), + Pos3::new(-light_size, 2.0 * side_length - light_offset, light_size), + Pos3::new(-light_size, 2.0 * side_length - light_offset, -light_size), ]); triangles.extend_from_slice(&[ - Triangle::new([offset, offset + 2, offset + 1], 1), - Triangle::new([offset + 3, offset + 1, offset + 2], 1), + Triangle::new([offset, 1 + offset, 2 + offset], 1), + Triangle::new([1 + offset, 3 + offset, 2 + offset], 1), + Triangle::new([offset, 4 + offset, 1 + offset], 1), + Triangle::new([1 + offset, 4 + offset, 5 + offset], 1), + Triangle::new([2 + offset, 3 + offset, 6 + offset], 1), + Triangle::new([3 + offset, 7 + offset, 6 + offset], 1), + Triangle::new([offset, 2 + offset, 4 + offset], 2), + Triangle::new([6 + offset, 4 + offset, 2 + offset], 2), + Triangle::new([1 + offset, 5 + offset, 3 + offset], 3), + Triangle::new([7 + offset, 3 + offset, 5 + offset], 3), + Triangle::new([8 + offset, 10 + offset, 9 + offset], 4), + Triangle::new([11 + offset, 9 + offset, 10 + offset], 4), ]); let scene = TriangleBVH::new(vertices, triangles, materials); @@ -59,8 +81,8 @@ pub fn scene() -> ExampleScene { ExampleScene { scene: f, - camera_pos: Pos3::new(-150.0, 100.0, 250.0), - camera_look_at: Pos3::new(0.0, 0.0, 0.0), + camera_pos: Pos3::new(-150.0, 160.0, 250.0), + camera_look_at: Pos3::new(0.0, 60.0, 0.0), camera_up: Dir3::up(), horizontal_fov: 90.0_f32.to_radians(), }