From 713fd25c9c88f03e576fb9a54bf7473bd56c0677 Mon Sep 17 00:00:00 2001 From: numzero Date: Thu, 20 Nov 2025 13:05:02 +0300 Subject: [PATCH] add generic reflector --- src/trace.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/trace.rs b/src/trace.rs index 5f461e6..baa2633 100644 --- a/src/trace.rs +++ b/src/trace.rs @@ -1,7 +1,7 @@ use std::f32::consts::PI; use glam::{Mat4, Vec2, Vec3, vec3}; -use rand_distr::Distribution; +use rand_distr::{Distribution, UnitSphere}; use crate::{camera::OrbitalCamera, ray::Ray}; @@ -134,3 +134,27 @@ impl Scene { }) } } + +pub trait Reflector { + fn brdf(&self, normal: Vec3, incident: Vec3, reflected: Vec3) -> f32 /* 1/sr */; + fn reflect(&self, rgen: &mut impl rand::Rng, normal: Vec3, incident: Vec3) -> Vec3; +} + +pub struct Lambertian; + +impl Reflector for Lambertian { + fn brdf(&self, _normal: Vec3, _incident: Vec3, _reflected: Vec3) -> f32 { + 1. / PI + } + + fn reflect(&self, rgen: &mut impl rand::Rng, normal: Vec3, _incident: Vec3) -> Vec3 { + let sphere: Vec3 = UnitSphere.sample(rgen).into(); + let sphere_n = normal.dot(sphere); // uniform on [-1, 1]! + let sphere_t = sphere - sphere_n * normal; + + let out_n_len2 = sphere_n.abs(); + let out_t = (1. + out_n_len2).recip().sqrt() * sphere_t; + let out_n = out_n_len2.sqrt() * normal; + out_t + out_n + } +}