From 9c69e2f4e2a15acbaaabf1a9213185f9f7da171a Mon Sep 17 00:00:00 2001 From: Altagos Date: Fri, 12 Apr 2024 22:44:23 +0200 Subject: [PATCH] schlick approximation --- src/main.zig | 4 +++- src/material.zig | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main.zig b/src/main.zig index 9cfbb6c..0cdb675 100644 --- a/src/main.zig +++ b/src/main.zig @@ -29,13 +29,15 @@ pub fn main() !void { // Setting up the world var material_ground = Material.lambertian(zm.f32x4(0.8, 0.8, 0.0, 1.0)); var material_center = Material.lambertian(zm.f32x4(0.1, 0.2, 0.5, 1.0)); - var material_left = Material.dielectric(1.0 / 1.33); + var material_left = Material.dielectric(1.5); + var material_bubble = Material.dielectric(1.0 / 1.5); var material_right = Material.metal(zm.f32x4(0.8, 0.6, 0.2, 1.0), 1.0); var world = HittableList.init(allocator); try world.add(Hittable.sphere(Sphere{ .center = zm.f32x4(0, -100.5, -1, 0), .radius = 100, .mat = &material_ground })); try world.add(Hittable.sphere(Sphere{ .center = zm.f32x4(0, 0, -1, 0), .radius = 0.5, .mat = &material_center })); try world.add(Hittable.sphere(Sphere{ .center = zm.f32x4(-1, 0, -1, 0), .radius = 0.5, .mat = &material_left })); + try world.add(Hittable.sphere(Sphere{ .center = zm.f32x4(-1, 0, -1, 0), .radius = 0.4, .mat = &material_bubble })); try world.add(Hittable.sphere(Sphere{ .center = zm.f32x4(1, 0, -1, 0), .radius = 0.5, .mat = &material_right })); const s = spall.trace(@src(), "Raytracer", .{}); diff --git a/src/material.zig b/src/material.zig index 3f3fec1..f5fa743 100644 --- a/src/material.zig +++ b/src/material.zig @@ -1,3 +1,5 @@ +const math = @import("std").math; + const zm = @import("zmath"); const hittable = @import("hittable.zig"); @@ -69,7 +71,7 @@ pub const Dielectric = struct { const cannot_refract = ri * sin_theta > 1.0; const direction = blk: { - if (cannot_refract) { + if (cannot_refract or reflectance(cos_theta, ri) > util.randomF32()) { break :blk util.reflect(unit_direction, rec.normal); } else { break :blk util.refract(unit_direction, rec.normal, ri); @@ -78,4 +80,10 @@ pub const Dielectric = struct { return Ray.init(rec.p, direction); } + + fn reflectance(cosine: f32, refraction_index: f32) f32 { + var r0 = (1 - refraction_index) / (1 + refraction_index); + r0 = r0 * r0; + return r0 + (1 - r0) * math.pow(f32, 1 - cosine, 5); + } }; -- 2.51.2