library: render: scene: fix reflection handling
The reflection will be calculated even if it ends up not contributing to the final color of an object. This allows for a more systematic use of coefficients without applying them twice, like it was done for the refraction transparency handling...
This commit is contained in:
parent
61db9c0cd4
commit
b29e6d1613
|
@ -180,14 +180,13 @@ impl Scene {
|
||||||
// Calculate the refracted ray, if it was refracted
|
// Calculate the refracted ray, if it was refracted
|
||||||
refracted(incident_ray, normal, diffraction_index, index).map_or_else(
|
refracted(incident_ray, normal, diffraction_index, index).map_or_else(
|
||||||
// Total reflection
|
// Total reflection
|
||||||
|| self.reflection(point, 1., reflected, reflection_limit, diffraction_index),
|
|| self.reflection(point, reflected, reflection_limit, diffraction_index),
|
||||||
// Refraction (refracted ray, amount of *reflection*)
|
// Refraction (refracted ray, amount of *reflection*)
|
||||||
|(r, refl_t)| {
|
|(r, refl_t)| {
|
||||||
let refr_light = self.refraction(point, coef, r, reflection_limit, index)
|
let refr_light = self.refraction(point, coef, r, reflection_limit, index)
|
||||||
* (1. - refl_t)
|
* (1. - refl_t)
|
||||||
+ self.reflection(
|
+ self.reflection(
|
||||||
point,
|
point,
|
||||||
refl_t,
|
|
||||||
reflected,
|
reflected,
|
||||||
reflection_limit,
|
reflection_limit,
|
||||||
diffraction_index,
|
diffraction_index,
|
||||||
|
@ -197,7 +196,7 @@ impl Scene {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Some(ReflTransEnum::Reflectivity { coef }) => {
|
Some(ReflTransEnum::Reflectivity { coef }) => {
|
||||||
self.reflection(point, coef, reflected, reflection_limit, diffraction_index)
|
self.reflection(point, reflected, reflection_limit, diffraction_index) * coef
|
||||||
+ lighting * (1. - coef)
|
+ lighting * (1. - coef)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -231,12 +230,11 @@ impl Scene {
|
||||||
fn reflection(
|
fn reflection(
|
||||||
&self,
|
&self,
|
||||||
point: Point,
|
point: Point,
|
||||||
reflectivity: f32,
|
|
||||||
reflected: Vector,
|
reflected: Vector,
|
||||||
reflection_limit: u32,
|
reflection_limit: u32,
|
||||||
diffraction_index: f32,
|
diffraction_index: f32,
|
||||||
) -> LinearColor {
|
) -> LinearColor {
|
||||||
if reflectivity > 1e-5 && reflection_limit > 0 {
|
if reflection_limit > 0 {
|
||||||
let reflection_start = point + reflected * 0.001;
|
let reflection_start = point + reflected * 0.001;
|
||||||
if let Some((t, obj)) = self.cast_ray(Ray::new(reflection_start, reflected)) {
|
if let Some((t, obj)) = self.cast_ray(Ray::new(reflection_start, reflected)) {
|
||||||
let resulting_position = reflection_start + reflected * t;
|
let resulting_position = reflection_start + reflected * t;
|
||||||
|
@ -247,7 +245,7 @@ impl Scene {
|
||||||
reflection_limit - 1,
|
reflection_limit - 1,
|
||||||
diffraction_index,
|
diffraction_index,
|
||||||
);
|
);
|
||||||
return color * reflectivity;
|
return color;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
LinearColor::black()
|
LinearColor::black()
|
||||||
|
|
Loading…
Reference in a new issue