From 86d009fb4c95521178469a1038a54447d5951c0c Mon Sep 17 00:00:00 2001 From: hal8174 Date: Wed, 28 May 2025 19:08:38 +0200 Subject: [PATCH 1/2] Fix hopefully last nan for iridescent material --- ray-tracing-material/src/iridescent.rs | 132 +++++++++++++------------ ray-tracing-scene/src/examples/mod.rs | 6 ++ ray-tracing-tev/src/main.rs | 10 +- 3 files changed, 84 insertions(+), 64 deletions(-) diff --git a/ray-tracing-material/src/iridescent.rs b/ray-tracing-material/src/iridescent.rs index 945ee16..4410d81 100644 --- a/ray-tracing-material/src/iridescent.rs +++ b/ray-tracing-material/src/iridescent.rs @@ -47,7 +47,7 @@ impl Iridescent { let imag = (num_imag * denom_real - num_real * denom_imag) / (denom_real * denom_real + denom_imag * denom_imag); - // if !real.is_normal() || !imag.is_normal() { + // if real.is_nan() || imag.is_nan() { // dbg!( // l, theta1, theta2, s_polaized, r12, phi, num_real, num_imag, denom_real, // denom_imag, real, imag @@ -57,13 +57,13 @@ impl Iridescent { real * real + imag * imag } - pub fn abs_C_squared(&self, l: f32, theta1: f32, theta2: f32, s_polaized: bool) -> f32 { + pub fn abs_c_squared(&self, l: f32, theta1: f32, theta2: f32, s_polaized: bool) -> f32 { let local_abs_r_1_squared = self.abs_r_1_squared(l, theta1, theta2, s_polaized); local_abs_r_1_squared / (1.0 - local_abs_r_1_squared) } - fn cos_K_Delta(&self, l: f32, theta1: f32, theta2: f32, s_polaized: bool) -> f32 { + fn cos_k_delta(&self, l: f32, theta1: f32, theta2: f32, s_polaized: bool) -> f32 { let k1z = 2.0 * f32::consts::PI * self.n1 * theta1.cos() / l; let k2z = 2.0 * f32::consts::PI * self.n2 * theta2.cos() / l; @@ -81,11 +81,11 @@ impl Iridescent { fn reflectance(&self, l: f32, theta1: f32, s_polaized: bool) -> f32 { let theta2 = f32::asin(f32::sin(theta1) * self.n1 / self.n2); - let local_cos_k_delta = self.cos_K_Delta(l, theta1, theta2, s_polaized); + let local_cos_k_delta = self.cos_k_delta(l, theta1, theta2, s_polaized); - let local_c_squred = self.abs_C_squared(l, theta1, theta2, s_polaized); + let local_c_squred = self.abs_c_squared(l, theta1, theta2, s_polaized); - // if !local_c_squred.is_normal() || !local_cos_k_delta.is_normal() { + // if local_c_squred.is_nan() || local_cos_k_delta.is_nan() { // dbg!(( // l, // theta1, @@ -96,62 +96,72 @@ impl Iridescent { // )); // } - if local_cos_k_delta.abs() < 1.0 { - let k_delta = f32::acos(local_cos_k_delta); - - let u = f32::sin(k_delta) / f32::sin(self.n * k_delta); - - // if !k_delta.is_normal() || !u.is_normal() { - // dbg!(( - // l, - // theta1, - // theta2, - // local_cos_k_delta, - // local_c_squred, - // s_polaized, - // k_delta, - // u, - // )); - // } - - local_c_squred / (local_c_squred + u * u) - } else if local_cos_k_delta.abs() > 1.0 { - let imk_delta = -f32::ln(f32::abs( - local_cos_k_delta - f32::sqrt(local_cos_k_delta * local_cos_k_delta - 1.0), - )); - - let u = f32::sinh(imk_delta) / f32::sinh(self.n * imk_delta); - - // if !imk_delta.is_normal() || !u.is_normal() { - // dbg!(( - // l, - // theta1, - // theta2, - // local_cos_k_delta, - // local_c_squred, - // s_polaized, - // imk_delta, - // u - // )); - // } - - local_c_squred / (local_c_squred + u * u) + if local_c_squred.is_infinite() { + 1.0 } else { - let u = 1.0 / self.n; + if local_cos_k_delta.abs() < 1.0 { + let k_delta = f32::acos(local_cos_k_delta); - // if !u.is_normal() { - // dbg!(( - // l, - // theta1, - // theta2, - // local_cos_k_delta, - // local_c_squred, - // s_polaized, - // u - // )); - // } + let u = f32::sin(k_delta) / f32::sin(self.n * k_delta); - local_c_squred / (local_c_squred + u * u) + let r = local_c_squred / (local_c_squred + u * u); + // if k_delta.is_nan() || u.is_nan() || r.is_nan() { + // dbg!(( + // l, + // theta1, + // theta2, + // local_cos_k_delta, + // local_c_squred, + // s_polaized, + // k_delta, + // u, + // r + // )); + // } + + r + } else if local_cos_k_delta.abs() > 1.0 { + let imk_delta = -f32::ln(f32::abs( + local_cos_k_delta - f32::sqrt(local_cos_k_delta * local_cos_k_delta - 1.0), + )); + + let u = f32::sinh(imk_delta) / f32::sinh(self.n * imk_delta); + + let r = local_c_squred / (local_c_squred + u * u); + // if imk_delta.is_nan() || u.is_nan() || r.is_nan() { + // dbg!(( + // l, + // theta1, + // theta2, + // local_cos_k_delta, + // local_c_squred, + // s_polaized, + // imk_delta, + // u, + // r + // )); + // } + + r + } else { + let u = 1.0 / self.n; + + let r = local_c_squred / (local_c_squred + u * u); + // if u.is_nan() || r.is_nan() { + // dbg!(( + // l, + // theta1, + // theta2, + // local_cos_k_delta, + // local_c_squred, + // s_polaized, + // u, + // r + // )); + // } + + r + } } } @@ -189,13 +199,13 @@ impl Iridescent { let r = self.averaged_reflectance(l, theta1); - // if !r.is_normal() { + // if r.is_nan() { // dbg!((theta1, l, r)); // } let color = Self::color_matching_function(l); - // if !color.r().is_normal() || !color.g().is_normal() || !color.b().is_normal() { + // if color.r().is_nan() || color.g().is_nan() || color.b().is_nan() { // dbg!(color); // } diff --git a/ray-tracing-scene/src/examples/mod.rs b/ray-tracing-scene/src/examples/mod.rs index 2371ac9..2f22952 100644 --- a/ray-tracing-scene/src/examples/mod.rs +++ b/ray-tracing-scene/src/examples/mod.rs @@ -33,6 +33,11 @@ pub fn example_scenes() -> HashMap<&'static str, Box() -> HashMap<&'static str, Box Date: Wed, 28 May 2025 19:27:55 +0200 Subject: [PATCH 2/2] Resolve all warnings. --- ray-tracing-egui/src/render.rs | 1 + ray-tracing-material/src/iridescent.rs | 117 +++++++++--------- .../src/acceleration_structure/mod.rs | 2 +- .../src/examples/basic_cornell.rs | 6 + ray-tracing-scene/src/examples/cornell2.rs | 6 + ray-tracing-scene/src/examples/mis_test.rs | 14 ++- ray-tracing-scene/src/examples/mod.rs | 2 +- ray-tracing-scene/src/examples/sphere.rs | 12 +- .../src/examples/stanford_dragon.rs | 12 +- .../src/examples/stanford_dragon_as.rs | 6 + 10 files changed, 92 insertions(+), 86 deletions(-) diff --git a/ray-tracing-egui/src/render.rs b/ray-tracing-egui/src/render.rs index cdc006a..c2ec26a 100644 --- a/ray-tracing-egui/src/render.rs +++ b/ray-tracing-egui/src/render.rs @@ -23,6 +23,7 @@ use vulkano::{ type DynRenderer = dyn ClassicalRenderer + Sync>, BasicCamera> + Sync; +#[allow(clippy::type_complexity)] pub const RENDERER: [(&str, fn(u32, u32) -> Box); 5] = [ ("Depth", |w, h| { Box::new(DepthRenderer::new(w, h)) as Box diff --git a/ray-tracing-material/src/iridescent.rs b/ray-tracing-material/src/iridescent.rs index 4410d81..a40363c 100644 --- a/ray-tracing-material/src/iridescent.rs +++ b/ray-tracing-material/src/iridescent.rs @@ -98,70 +98,65 @@ impl Iridescent { if local_c_squred.is_infinite() { 1.0 + } else if local_cos_k_delta.abs() < 1.0 { + let k_delta = f32::acos(local_cos_k_delta); + + let u = f32::sin(k_delta) / f32::sin(self.n * k_delta); + + // if k_delta.is_nan() || u.is_nan() || r.is_nan() { + // dbg!(( + // l, + // theta1, + // theta2, + // local_cos_k_delta, + // local_c_squred, + // s_polaized, + // k_delta, + // u, + // r + // )); + // } + + local_c_squred / (local_c_squred + u * u) + } else if local_cos_k_delta.abs() > 1.0 { + let imk_delta = -f32::ln(f32::abs( + local_cos_k_delta - f32::sqrt(local_cos_k_delta * local_cos_k_delta - 1.0), + )); + + let u = f32::sinh(imk_delta) / f32::sinh(self.n * imk_delta); + + // if imk_delta.is_nan() || u.is_nan() || r.is_nan() { + // dbg!(( + // l, + // theta1, + // theta2, + // local_cos_k_delta, + // local_c_squred, + // s_polaized, + // imk_delta, + // u, + // r + // )); + // } + + local_c_squred / (local_c_squred + u * u) } else { - if local_cos_k_delta.abs() < 1.0 { - let k_delta = f32::acos(local_cos_k_delta); + let u = 1.0 / self.n; - let u = f32::sin(k_delta) / f32::sin(self.n * k_delta); + // if u.is_nan() || r.is_nan() { + // dbg!(( + // l, + // theta1, + // theta2, + // local_cos_k_delta, + // local_c_squred, + // s_polaized, + // u, + // r + // )); + // } - let r = local_c_squred / (local_c_squred + u * u); - // if k_delta.is_nan() || u.is_nan() || r.is_nan() { - // dbg!(( - // l, - // theta1, - // theta2, - // local_cos_k_delta, - // local_c_squred, - // s_polaized, - // k_delta, - // u, - // r - // )); - // } - - r - } else if local_cos_k_delta.abs() > 1.0 { - let imk_delta = -f32::ln(f32::abs( - local_cos_k_delta - f32::sqrt(local_cos_k_delta * local_cos_k_delta - 1.0), - )); - - let u = f32::sinh(imk_delta) / f32::sinh(self.n * imk_delta); - - let r = local_c_squred / (local_c_squred + u * u); - // if imk_delta.is_nan() || u.is_nan() || r.is_nan() { - // dbg!(( - // l, - // theta1, - // theta2, - // local_cos_k_delta, - // local_c_squred, - // s_polaized, - // imk_delta, - // u, - // r - // )); - // } - - r - } else { - let u = 1.0 / self.n; - - let r = local_c_squred / (local_c_squred + u * u); - // if u.is_nan() || r.is_nan() { - // dbg!(( - // l, - // theta1, - // theta2, - // local_cos_k_delta, - // local_c_squred, - // s_polaized, - // u, - // r - // )); - // } - - r - } + local_c_squred / (local_c_squred + u * u) } } diff --git a/ray-tracing-scene/src/acceleration_structure/mod.rs b/ray-tracing-scene/src/acceleration_structure/mod.rs index 4bf44b2..9064988 100644 --- a/ray-tracing-scene/src/acceleration_structure/mod.rs +++ b/ray-tracing-scene/src/acceleration_structure/mod.rs @@ -83,7 +83,7 @@ impl, R: Rng> Scene for AccelerationStructureSc let material = &self.materials[i as usize]; - let light_pdf = if let Some(l) = &material.light { + let light_pdf = if let Some(_l) = &material.light { 0.0 } else { 0.0 diff --git a/ray-tracing-scene/src/examples/basic_cornell.rs b/ray-tracing-scene/src/examples/basic_cornell.rs index 0c9dd9d..5d648ba 100644 --- a/ray-tracing-scene/src/examples/basic_cornell.rs +++ b/ray-tracing-scene/src/examples/basic_cornell.rs @@ -19,6 +19,12 @@ impl BasicCornell { } } +impl Default for BasicCornell { + fn default() -> Self { + Self::new() + } +} + impl ExampleScene for BasicCornell { fn get_scene(&self) -> Box + Sync> { let s = self.scene.get_or_init(|| { diff --git a/ray-tracing-scene/src/examples/cornell2.rs b/ray-tracing-scene/src/examples/cornell2.rs index 5536df1..8145f87 100644 --- a/ray-tracing-scene/src/examples/cornell2.rs +++ b/ray-tracing-scene/src/examples/cornell2.rs @@ -22,6 +22,12 @@ impl Cornell2 { } } +impl Default for Cornell2 { + fn default() -> Self { + Self::new() + } +} + impl ExampleScene for Cornell2 { fn get_scene(&self) -> Box + Sync> { let s = self.scene.get_or_init(|| { diff --git a/ray-tracing-scene/src/examples/mis_test.rs b/ray-tracing-scene/src/examples/mis_test.rs index 3a6695a..bf7d11d 100644 --- a/ray-tracing-scene/src/examples/mis_test.rs +++ b/ray-tracing-scene/src/examples/mis_test.rs @@ -1,15 +1,11 @@ -use std::cell::OnceCell; - -use crate::triangle_bvh::{BVHMaterial, Triangle, TriangleBVH}; - use super::ExampleScene; - +use crate::triangle_bvh::{BVHMaterial, Triangle, TriangleBVH}; use ray_tracing_core::{light::AreaLight, prelude::*, scene::Scene}; use ray_tracing_material::{ - diffuse::DiffuseMaterial, microfacet::{BeckmannDistribution, Microfacet}, mirror::Mirror, }; +use std::cell::OnceCell; pub struct MISTest { scene: OnceCell>, @@ -67,6 +63,12 @@ impl MISTest { } } +impl Default for MISTest { + fn default() -> Self { + Self::new() + } +} + impl ExampleScene for MISTest { fn get_scene(&self) -> Box + Sync> { let s = self.scene.get_or_init(move || { diff --git a/ray-tracing-scene/src/examples/mod.rs b/ray-tracing-scene/src/examples/mod.rs index 2f22952..f7b0dcd 100644 --- a/ray-tracing-scene/src/examples/mod.rs +++ b/ray-tracing-scene/src/examples/mod.rs @@ -49,7 +49,7 @@ pub fn example_scenes() -> HashMap<&'static str, Box { scene: OnceCell>, diff --git a/ray-tracing-scene/src/examples/stanford_dragon.rs b/ray-tracing-scene/src/examples/stanford_dragon.rs index 80179d5..ccc14a8 100644 --- a/ray-tracing-scene/src/examples/stanford_dragon.rs +++ b/ray-tracing-scene/src/examples/stanford_dragon.rs @@ -1,15 +1,11 @@ -use rand::Rng; -use ray_tracing_core::{light::AreaLight, prelude::*, scene::Scene}; -use ray_tracing_material::{ - microfacet::{BeckmannDistribution, Microfacet}, - oren_nayar::OrenNayar, -}; -use std::cell::{Cell, OnceCell}; - use crate::{ parse_obj::ObjData, triangle_bvh::{BVHMaterial, Triangle, TriangleBVH}, }; +use rand::Rng; +use ray_tracing_core::{light::AreaLight, prelude::*, scene::Scene}; +use ray_tracing_material::oren_nayar::OrenNayar; +use std::cell::{Cell, OnceCell}; use super::ExampleScene; diff --git a/ray-tracing-scene/src/examples/stanford_dragon_as.rs b/ray-tracing-scene/src/examples/stanford_dragon_as.rs index 5e5a600..7be3517 100644 --- a/ray-tracing-scene/src/examples/stanford_dragon_as.rs +++ b/ray-tracing-scene/src/examples/stanford_dragon_as.rs @@ -28,6 +28,12 @@ impl StanfordDragon { } } +impl Default for StanfordDragon { + fn default() -> Self { + Self::new() + } +} + impl ExampleScene for StanfordDragon { fn get_scene(&self) -> Box + Sync> { let s = self.scene.get_or_init(|| {