Add dielectric pbrt material

This commit is contained in:
hal8174 2025-08-28 00:22:58 +02:00
parent 0480e041cd
commit 2269bd102d
Signed by: hal8174
SSH key fingerprint: SHA256:NN98ZYwnrreQLSOV/g+amY7C3yL/mS1heD7bi5t6PPw
5 changed files with 43 additions and 27 deletions

View file

@ -1,4 +1,6 @@
use ray_tracing_core::{color::Color, material::SampleResult, prelude::*};
use ray_tracing_core::{
color::Color, material::SampleResult, math::material::fresnel_real, prelude::*,
};
use crate::{
either::Either,
@ -103,20 +105,33 @@ impl<R: Rng> PbrtMaterial<R> for PbrtDielectricMaterial {
let _ = rng;
let _ = v;
let _ = u;
let _ = match self.eta {
let eta = match self.eta {
Either::A(Either::A(eta)) => eta,
_ => todo!(),
};
// let c = w_in.y();
// let w_out = -w_in * eta
// + (eta * c - Float::sqrt(1.0 - eta * eta * (1.0 - c * c))) * Dir3::new(0.0, -1.0, 1.0);
let (n1, n2) = if w_in.y() >= 0.0 {
(1.0, eta)
} else {
(eta, 1.0)
};
SampleResult::new(
Dir3::new(0.0, 2.0 * w_in.y(), 0.0) - w_in,
Color::white(),
true,
)
let r = fresnel_real(w_in.y().abs(), n1, n2);
if r >= rng.r#gen() {
SampleResult::new(
Dir3::new(0.0, 2.0 * w_in.y(), 0.0) - w_in,
Color::white(),
true,
)
} else {
let r = n1 / n2;
let w_out = -w_in * r
+ (r * w_in.y().abs() - Float::sqrt(1.0 - r * r * (1.0 - w_in.y() * w_in.y())))
* Dir3::new(0.0, if w_in.y() > 0.0 { 1.0 } else { -1.0 }, 0.0);
SampleResult::new(w_out, Color::white(), true)
}
}
fn pdf(&self, u: Float, v: Float, w_in: Dir3, w_out: Dir3) -> Float {