Add dielectric pbrt material
This commit is contained in:
parent
0480e041cd
commit
2269bd102d
5 changed files with 43 additions and 27 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue