Add "fuzz" to metals

This commit is contained in:
Samrat Man Singh 2017-09-05 10:45:33 +05:45
parent ec8480f231
commit 1f9994d4f0

View file

@ -3,8 +3,8 @@ open Printf
open Vec3 open Vec3
open Ray open Ray
type material = Lambertian of Vec3.vec3 (* matte surface *) type material = Lambertian of Vec3.vec3 (* albedo *)
| Metal of Vec3.vec3 | Metal of Vec3.vec3 * float (* albedo, fuzz *)
| DummyNone (* TODO: use option type instead *) | DummyNone (* TODO: use option type instead *)
type sphere = { center: Vec3.vec3; type sphere = { center: Vec3.vec3;
@ -51,9 +51,9 @@ let hit_scatter rin hit_rec =
scatter = true;} scatter = true;}
in scatter in scatter
(* "shiny"- angle of reflectance = angle of incidence *) (* "shiny"- angle of reflectance = angle of incidence *)
| Metal(albedo) -> | Metal(albedo, fuzz) ->
let reflected = reflect (Vec3.unit_vector rin.dir) hit_rec.normal in let reflected = reflect (Vec3.unit_vector rin.dir) hit_rec.normal in
let scattered_ray = Ray.create hit_rec.p reflected in let scattered_ray = Ray.create hit_rec.p (Vec3.add reflected (Vec3.mul fuzz (random_in_unit_sphere ()))) in
let scattered = { ray = scattered_ray; let scattered = { ray = scattered_ray;
color = albedo; color = albedo;
scatter = (Vec3.dot scattered_ray.dir hit_rec.normal) > 0.0;} in scatter = (Vec3.dot scattered_ray.dir hit_rec.normal) > 0.0;} in
@ -136,15 +136,15 @@ let write_to_file filename =
mat = Lambertian (Vec3.of_floats (0.8, 0.8, 0.0))} in mat = Lambertian (Vec3.of_floats (0.8, 0.8, 0.0))} in
let sphere3 = Sphere {center = Vec3.of_floats (-1.0, 0., -1.); let sphere3 = Sphere {center = Vec3.of_floats (-1.0, 0., -1.);
radius = 0.5; radius = 0.5;
mat = Metal (Vec3.of_floats (0.8, 0.6, 0.2))} in mat = Metal ((Vec3.of_floats (0.8, 0.6, 0.2)), 0.4)} in
let sphere4 = Sphere {center = Vec3.of_floats (1.0, 0., -1.); let sphere4 = Sphere {center = Vec3.of_floats (1.0, 0., -1.);
radius = 0.5; radius = 0.5;
mat = Metal (Vec3.of_floats (0.8, 0.8, 0.8))} in mat = Metal ((Vec3.of_floats (0.8, 0.8, 0.8)), 0.1)} in
let world = World [sphere3; sphere2; sphere1; sphere4] in let world = World [sphere3; sphere2; sphere1; sphere4] in
let nx = 400 in let nx = 400 in
let ny = 200 in let ny = 200 in
let ns = 60 in let ns = 150 in (* samples per pixel *)
let oc = Out_channel.create filename in let oc = Out_channel.create filename in
fprintf oc "P3\n"; fprintf oc "P3\n";
fprintf oc "%d\n" nx; fprintf oc "%d\n" nx;