add alternate diffuse method
This commit is contained in:
parent
58f710c967
commit
3296ea3e81
|
@ -41,7 +41,7 @@ fn rayColor(ray: Ray, world: World, rng: *Random, depth: i32) Color {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (world.hit(ray, 0.001, 99999)) |hit| {
|
if (world.hit(ray, 0.001, 99999)) |hit| {
|
||||||
const target = hit.p.add(hit.normal).add(vec3.random_in_unit_sphere(rng));
|
const target = hit.p.add(vec3.random_in_hemisphere(rng, hit.normal));
|
||||||
const newRay = Ray{ .origin = hit.p, .direction = target.sub(hit.p)};
|
const newRay = Ray{ .origin = hit.p, .direction = target.sub(hit.p)};
|
||||||
return rayColor(newRay, world, rng, depth - 1).div(2);
|
return rayColor(newRay, world, rng, depth - 1).div(2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,20 @@ pub fn random_in_unit_sphere(rng: *Random) Vec3 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn random_unit_vector(rng: *Random) Vec3 {
|
||||||
|
return unitVector(random_in_unit_sphere(rng));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn random_in_hemisphere(rng: *Random, normal: Vec3) Vec3 {
|
||||||
|
const in_unit_sphere = random_in_unit_sphere(rng);
|
||||||
|
if (in_unit_sphere.dot(normal) > 0) {
|
||||||
|
// In the same hemisphere as the normal
|
||||||
|
return in_unit_sphere;
|
||||||
|
} else {
|
||||||
|
return in_unit_sphere.mul(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub const Point3 = Vec3;
|
pub const Point3 = Vec3;
|
||||||
|
|
||||||
const assert = @import("std").debug.assert;
|
const assert = @import("std").debug.assert;
|
||||||
|
|
Loading…
Reference in a new issue