aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2022-11-27 18:24:17 +0900
committernsfisis <nsfisis@gmail.com>2022-11-27 18:24:17 +0900
commit1f6260067421201eb7e26918aaceaa07ebb0982c (patch)
tree579ddb080db428054c5525e3e9e32bfea245f79d
parentccfb47eb2502874a21d9a701dfedc46377771478 (diff)
downloadRayTracingInOneWeekend.zig-1f6260067421201eb7e26918aaceaa07ebb0982c.tar.gz
RayTracingInOneWeekend.zig-1f6260067421201eb7e26918aaceaa07ebb0982c.tar.zst
RayTracingInOneWeekend.zig-1f6260067421201eb7e26918aaceaa07ebb0982c.zip
10.4
-rw-r--r--src/main.zig9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/main.zig b/src/main.zig
index a501847..19f7d69 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -192,7 +192,6 @@ const DielectricMaterial = struct {
ir: f64,
fn scatter(mat: DielectricMaterial, r_in: Ray, record: HitRecord, attenuation: *Color, scattered: *Ray, rand: std.rand.Random) bool {
- _ = rand;
const refraction_ratio = if (record.front_face) 1.0 / mat.ir else mat.ir;
const unit_dir = r_in.dir.normalized();
@@ -201,11 +200,17 @@ const DielectricMaterial = struct {
// sin(theta') = refraction_ratio * sin(theta) <= 1
const can_refract = refraction_ratio * sin_theta <= 1.0;
- const dir = if (can_refract) refract(unit_dir, record.normal, refraction_ratio) else reflect(unit_dir, record.normal);
+ const dir = if (can_refract and reflectance(cos_theta, refraction_ratio) < randomReal01(rand)) refract(unit_dir, record.normal, refraction_ratio) else reflect(unit_dir, record.normal);
scattered.* = Ray{ .origin = record.p, .dir = dir };
attenuation.* = Color{ .x = 1.0, .y = 1.0, .z = 1.0 };
return true;
}
+
+ fn reflectance(cos: f64, refraction_idx: f64) f64 {
+ const r0 = (1.0 - refraction_idx) / (1.0 + refraction_idx);
+ const r1 = r0 * r0;
+ return r1 + (1.0 - r1) * math.pow(f64, 1.0 - cos, 5.0);
+ }
};
const HitRecord = struct {