add reflectance
This commit is contained in:
parent
4a478b08a0
commit
7d830d13d1
|
@ -58,13 +58,21 @@ pub const Dielectric = struct {
|
||||||
const sin_theta = math.sqrt(1.0 - cos_theta * cos_theta);
|
const sin_theta = math.sqrt(1.0 - cos_theta * cos_theta);
|
||||||
|
|
||||||
const cant_refract = refraction_ratio * sin_theta > 1.0;
|
const cant_refract = refraction_ratio * sin_theta > 1.0;
|
||||||
const direction = if (cant_refract) unit_direction.reflect(hit.normal)
|
const should_reflect = reflectance(cos_theta, refraction_ratio) > rng.float(f32);
|
||||||
|
const direction = if (cant_refract or should_reflect) unit_direction.reflect(hit.normal)
|
||||||
else unit_direction.refract(hit.normal, refraction_ratio);
|
else unit_direction.refract(hit.normal, refraction_ratio);
|
||||||
return ScatteredRay{
|
return ScatteredRay{
|
||||||
.ray = Ray{ .origin = hit.p, .direction = direction},
|
.ray = Ray{ .origin = hit.p, .direction = direction},
|
||||||
.color = attenuation,
|
.color = attenuation,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn reflectance(cosine: f32, ref_idx: f32) f32 {
|
||||||
|
// Use Schlick's approximation for reflectance.
|
||||||
|
var r0 = (1 - ref_idx) / (1 + ref_idx);
|
||||||
|
r0 = r0*r0;
|
||||||
|
return r0 + (1 - r0) * math.pow(f32, 1 - cosine, 5);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const ScatteredRay = struct {
|
pub const ScatteredRay = struct {
|
||||||
|
|
Loading…
Reference in a new issue