diff options
| author | nsfisis <nsfisis@gmail.com> | 2022-11-27 18:24:17 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2022-11-27 18:24:17 +0900 |
| commit | 1f6260067421201eb7e26918aaceaa07ebb0982c (patch) | |
| tree | 579ddb080db428054c5525e3e9e32bfea245f79d /src/main.zig | |
| parent | ccfb47eb2502874a21d9a701dfedc46377771478 (diff) | |
| download | RayTracingInOneWeekend.zig-1f6260067421201eb7e26918aaceaa07ebb0982c.tar.gz RayTracingInOneWeekend.zig-1f6260067421201eb7e26918aaceaa07ebb0982c.tar.zst RayTracingInOneWeekend.zig-1f6260067421201eb7e26918aaceaa07ebb0982c.zip | |
10.4
Diffstat (limited to 'src/main.zig')
| -rw-r--r-- | src/main.zig | 9 |
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 { |
