mirror of
https://github.com/c-cube/moonpool.git
synced 2025-12-06 03:05:30 -05:00
Add "fuzz" to metals
This commit is contained in:
parent
ec8480f231
commit
1f9994d4f0
1 changed files with 7 additions and 7 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue