From f9217e45eac5b753684ecef105c1c09c40fe3888 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Thu, 10 Mar 2016 12:38:27 +0545 Subject: [PATCH 01/27] Initial commit --- src/raytracer.ml | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ src/vec3.ml | 38 +++++++++++++++++++++++++++++ src/vec3.mli | 11 +++++++++ 3 files changed, 112 insertions(+) create mode 100644 src/raytracer.ml create mode 100644 src/vec3.ml create mode 100644 src/vec3.mli diff --git a/src/raytracer.ml b/src/raytracer.ml new file mode 100644 index 00000000..fbeea03c --- /dev/null +++ b/src/raytracer.ml @@ -0,0 +1,63 @@ +open Core.Std +open Printf +open Vec3 + +type sphere = { center: Vec3.vec3; + radius: float } +type ray = { origin: Vec3.vec3; + dir: Vec3.vec3 } + +let hit_sphere sphere ray = + let oc = sub ray.dir sphere.center in + let a = dot ray.dir ray.dir in + let b = dot oc ray.dir in + let c = (dot oc oc) -. (sphere.radius *. sphere.radius) in + let discriminant = b*.b -. a*.c in + + ( discriminant > 0.0) + +let get_color ray = + if (hit_sphere {center = Vec3.of_floats (0., 0., -1.); + radius = 0.5} + ray) + then Vec3.of_floats (1., 0., 0.) + else let unit_direction = unit_vector ray.dir in + let t = 0.5 *. (unit_direction.y +. 1.0) in + add (mul (1.0 -. t) {x= 1.0; y=1.0; z= 1.0}) (mul t {x= 0.5; y= 0.7; z= 1.0}) + + +let main() = + let nx = 200 in + let ny = 100 in + print_string "P3\n"; + printf "%d\n" nx; + printf "%d\n" ny; + print_string "\n255\n"; + + let lower_left_corner = Vec3.of_floats (-2., -1., -1.) in + let horizontal = Vec3.of_floats (4., 0., 0.) in + let vertical = Vec3.of_floats (0., 2., 0.) in + let origin = Vec3.of_floats (0., 0., 0.) in + let color = ref {x=0.; y=0.; z=0.} in + for j = ny downto 1 do + for i = 0 to nx-1 do + let u = (Float.of_int i) /. (Float.of_int nx) in + let v = (Float.of_int j) /. (Float.of_int ny) in + + let r = { origin = origin; + dir = Vec3.add lower_left_corner (Vec3.add (Vec3.mul u horizontal) (Vec3.mul v vertical)) } in + color := get_color r; + + let {x=r; y=g; z=b} = !color in + let (ir, ig, ib) = (Int.of_float (r*.255.99), + Int.of_float (g*.255.99), + Int.of_float (b*.255.99)) in + printf "%d " ir; + printf "%d " ig; + printf "%d " ib; + print_newline(); + done + done +;; + +(* main() *) diff --git a/src/vec3.ml b/src/vec3.ml new file mode 100644 index 00000000..663a041a --- /dev/null +++ b/src/vec3.ml @@ -0,0 +1,38 @@ +type vec3 = { x: float; + y: float; + z: float } + +let of_floats (e1, e2, e3) = + {x = e1; y = e2; z = e3} + +let add v w = + {x = v.x +. w.x; + y = v.y +. w.y; + z = v.z +. w.z} + +let sub v w = + {x = v.x -. w.x; + y = v.y -. w.y; + z = v.z -. w.z} + +let dot v w = + v.x*.w.x +. v.y*.w.y +.v.z*.w.z + +let cross v w = + {x = v.y*.w.z -. v.z*.w.y; + y = v.z*.w.x -. v.x*.w.z; + z = v.x*.w.y -. v.y*.w.x} + +let length v = + sqrt (dot v v) + +let unit_vector v = + let l = length v in + { x = v.x /. l; + y = v.y /. l; + z = v.z /. l } + +let mul t v = + { x = t *. v.x; + y = t *. v.y; + z = t *. v.z } diff --git a/src/vec3.mli b/src/vec3.mli new file mode 100644 index 00000000..d29871fa --- /dev/null +++ b/src/vec3.mli @@ -0,0 +1,11 @@ +type vec3 = { x: float; + y: float; + z: float } + +val of_floats : float * float * float -> vec3 +val add : vec3 -> vec3 -> vec3 +val sub : vec3 -> vec3 -> vec3 +val dot : vec3 -> vec3 -> float +val cross: vec3 -> vec3 -> vec3 +val mul : float -> vec3 -> vec3 +val unit_vector : vec3 -> vec3 From fc2f1f244bcaf70cfc59c5db318e51f49db1e8ac Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Thu, 10 Mar 2016 21:14:52 +0545 Subject: [PATCH 02/27] Visualize surface normals --- src/Makefile | 5 +++++ src/raytracer.ml | 23 +++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 src/Makefile diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 00000000..4dc45a53 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,5 @@ +build: + ocamlbuild -use-ocamlfind -package core -tag thread raytracer.native +display: build + ./raytracer.native > foo.ppm + display foo.ppm diff --git a/src/raytracer.ml b/src/raytracer.ml index fbeea03c..d30f8f0e 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -7,20 +7,27 @@ type sphere = { center: Vec3.vec3; type ray = { origin: Vec3.vec3; dir: Vec3.vec3 } +let point_at_parameter r t = + add r.origin (mul t r.dir) + let hit_sphere sphere ray = - let oc = sub ray.dir sphere.center in + let oc = sub ray.origin sphere.center in let a = dot ray.dir ray.dir in - let b = dot oc ray.dir in + let b = (dot oc ray.dir) in let c = (dot oc oc) -. (sphere.radius *. sphere.radius) in let discriminant = b*.b -. a*.c in - ( discriminant > 0.0) + if (discriminant > 0.0) + then (-.b +. (sqrt discriminant)) /. a + else -1.0 let get_color ray = - if (hit_sphere {center = Vec3.of_floats (0., 0., -1.); - radius = 0.5} - ray) - then Vec3.of_floats (1., 0., 0.) + let sphere = {center = Vec3.of_floats (0., 0., -1.); + radius = 0.5 } in + let t = (hit_sphere sphere ray) in + if (t > 0.0) + then let n = unit_vector (sub (point_at_parameter ray t) sphere.center) in + mul 0.5 (Vec3.of_floats (n.x +. 1., n.y +. 1., n.z +. 1.)) else let unit_direction = unit_vector ray.dir in let t = 0.5 *. (unit_direction.y +. 1.0) in add (mul (1.0 -. t) {x= 1.0; y=1.0; z= 1.0}) (mul t {x= 0.5; y= 0.7; z= 1.0}) @@ -60,4 +67,4 @@ let main() = done ;; -(* main() *) +main() From 3e0afa04c4b64dc6437360ae4e2c1660ca97082b Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Thu, 10 Mar 2016 21:15:10 +0545 Subject: [PATCH 03/27] Add .merlin --- .merlin | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .merlin diff --git a/.merlin b/.merlin new file mode 100644 index 00000000..8235f457 --- /dev/null +++ b/.merlin @@ -0,0 +1,2 @@ +S src +PKG core From ea62b75010cf49fe87dc13b2c118bd1c38644477 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Fri, 11 Mar 2016 10:04:09 +0545 Subject: [PATCH 04/27] Add Ray as a module --- src/ray.ml | 5 +++++ src/raytracer.ml | 48 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 src/ray.ml diff --git a/src/ray.ml b/src/ray.ml new file mode 100644 index 00000000..8a392d1d --- /dev/null +++ b/src/ray.ml @@ -0,0 +1,5 @@ +type ray = { origin: Vec3.vec3; + dir: Vec3.vec3 } + +let point_at_parameter r t = + Vec3.add r.origin (Vec3.mul t r.dir) diff --git a/src/raytracer.ml b/src/raytracer.ml index d30f8f0e..8990ad01 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -1,14 +1,10 @@ open Core.Std open Printf open Vec3 - +open Ray + type sphere = { center: Vec3.vec3; radius: float } -type ray = { origin: Vec3.vec3; - dir: Vec3.vec3 } - -let point_at_parameter r t = - add r.origin (mul t r.dir) let hit_sphere sphere ray = let oc = sub ray.origin sphere.center in @@ -26,12 +22,46 @@ let get_color ray = radius = 0.5 } in let t = (hit_sphere sphere ray) in if (t > 0.0) - then let n = unit_vector (sub (point_at_parameter ray t) sphere.center) in + then let n = unit_vector (sub (Ray.point_at_parameter ray t) sphere.center) in mul 0.5 (Vec3.of_floats (n.x +. 1., n.y +. 1., n.z +. 1.)) else let unit_direction = unit_vector ray.dir in let t = 0.5 *. (unit_direction.y +. 1.0) in add (mul (1.0 -. t) {x= 1.0; y=1.0; z= 1.0}) (mul t {x= 0.5; y= 0.7; z= 1.0}) - + +let write_to_file filename = + let nx = 200 in + let ny = 100 in + let oc = Out_channel.create filename in + fprintf oc "P3\n"; + fprintf oc "%d\n" nx; + fprintf oc "%d\n" ny; + fprintf oc "\n255\n"; + let lower_left_corner = Vec3.of_floats (-2., -1., -1.) in + let horizontal = Vec3.of_floats (4., 0., 0.) in + let vertical = Vec3.of_floats (0., 2., 0.) in + let origin = Vec3.of_floats (0., 0., 0.) in + let color = ref {x=0.; y=0.; z=0.} in + for j = ny downto 1 do + for i = 0 to nx-1 do + let u = (Float.of_int i) /. (Float.of_int nx) in + let v = (Float.of_int j) /. (Float.of_int ny) in + + let r = { origin = origin; + dir = Vec3.add lower_left_corner (Vec3.add (Vec3.mul u horizontal) (Vec3.mul v vertical)) } in + color := get_color r; + + let {x=r; y=g; z=b} = !color in + let (ir, ig, ib) = (Int.of_float (r*.255.99), + Int.of_float (g*.255.99), + Int.of_float (b*.255.99)) in + fprintf oc "%d " ir; + fprintf oc "%d " ig; + fprintf oc "%d \n" ib; + done + done; + Out_channel.close oc; +;; + let main() = let nx = 200 in @@ -67,4 +97,4 @@ let main() = done ;; -main() +(* main() *) From 1380a1a07f211964979128274ecc314465bc3ce1 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Fri, 11 Mar 2016 11:32:36 +0545 Subject: [PATCH 05/27] Add types hitable to support World of multiple objects --- src/raytracer.ml | 71 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 8990ad01..ca4d2013 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -6,28 +6,83 @@ open Ray type sphere = { center: Vec3.vec3; radius: float } -let hit_sphere sphere ray = +type hitable = Sphere of sphere + | World of hitable list + +type hit = { t : float; + p: Vec3.vec3; + normal: Vec3.vec3; + hit: bool } + +let hit_sphere sphere ray (tmin, tmax) = let oc = sub ray.origin sphere.center in let a = dot ray.dir ray.dir in let b = (dot oc ray.dir) in let c = (dot oc oc) -. (sphere.radius *. sphere.radius) in let discriminant = b*.b -. a*.c in + let no_hit = { t = -1.0; + p = Vec3.of_floats (Float.infinity, Float.infinity, Float.infinity); + normal = Vec3.of_floats (0., 0., 0.); + hit = false } in + if (discriminant > 0.0) - then (-.b +. (sqrt discriminant)) /. a - else -1.0 + then + let t = (-.b +. (sqrt discriminant)) /. a in + + if (t < tmax && t > tmin) + then + let p = Ray.point_at_parameter ray t in + { t = t; + p = p; + normal = unit_vector (sub p sphere.center); + hit = true } + else + let t = (-.b -. (sqrt discriminant)) /. a in + if (t < tmax && t > tmin) + then + let p = Ray.point_at_parameter ray t in + { t = t; + p = p; + normal = unit_vector (sub p sphere.center); + hit = true } + else no_hit + else no_hit + +let rec hit_world world ray (tmin, tmax) = + let init_rec = { t = tmax; + p = Vec3.of_floats (-1., -1., -1.); + normal = Vec3.of_floats (-1., -1., -1.); + hit = false; } in + List.fold world + ~init: init_rec + ~f: (fun acc h -> + let hit_rec = (hit h ray (tmin, acc.t)) in + if (hit_rec.hit) + then hit_rec + else acc) +and hit h ray (tmin, tmax) = + match h with + Sphere s -> hit_sphere s ray (tmin, tmax) + | World w -> hit_world w ray (tmin, tmax) + let get_color ray = - let sphere = {center = Vec3.of_floats (0., 0., -1.); - radius = 0.5 } in - let t = (hit_sphere sphere ray) in - if (t > 0.0) - then let n = unit_vector (sub (Ray.point_at_parameter ray t) sphere.center) in + let sphere1 = Sphere {center = Vec3.of_floats (0., 0., -1.); + radius = 0.5 } in + let sphere2 = Sphere {center = Vec3.of_floats (0., -100.5, -1.); + radius = 100.0 } in + let world = World [sphere1; sphere2] in + let hit_result = (hit world ray (0., Float.infinity)) in + let t = hit_result.t in + if (hit_result.hit && (t > 0.0)) + then let n = hit_result.normal in mul 0.5 (Vec3.of_floats (n.x +. 1., n.y +. 1., n.z +. 1.)) else let unit_direction = unit_vector ray.dir in let t = 0.5 *. (unit_direction.y +. 1.0) in add (mul (1.0 -. t) {x= 1.0; y=1.0; z= 1.0}) (mul t {x= 0.5; y= 0.7; z= 1.0}) + let write_to_file filename = let nx = 200 in let ny = 100 in From bf8996c9530a6a1857c35f226f6ba2041f1ba1cc Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Fri, 11 Mar 2016 12:06:01 +0545 Subject: [PATCH 06/27] Use `option` to signal when no object is hit --- src/raytracer.ml | 74 +++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index ca4d2013..80da2b25 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -9,10 +9,12 @@ type sphere = { center: Vec3.vec3; type hitable = Sphere of sphere | World of hitable list -type hit = { t : float; - p: Vec3.vec3; - normal: Vec3.vec3; - hit: bool } +type hit_rec = { t : float; + p: Vec3.vec3; + normal: Vec3.vec3; } + +type hit = hit_rec option + let hit_sphere sphere ray (tmin, tmax) = let oc = sub ray.origin sphere.center in @@ -21,11 +23,6 @@ let hit_sphere sphere ray (tmin, tmax) = let c = (dot oc oc) -. (sphere.radius *. sphere.radius) in let discriminant = b*.b -. a*.c in - let no_hit = { t = -1.0; - p = Vec3.of_floats (Float.infinity, Float.infinity, Float.infinity); - normal = Vec3.of_floats (0., 0., 0.); - hit = false } in - if (discriminant > 0.0) then let t = (-.b +. (sqrt discriminant)) /. a in @@ -33,34 +30,33 @@ let hit_sphere sphere ray (tmin, tmax) = if (t < tmax && t > tmin) then let p = Ray.point_at_parameter ray t in - { t = t; - p = p; - normal = unit_vector (sub p sphere.center); - hit = true } + Some { t = t; + p = p; + normal = unit_vector (sub p sphere.center); } else let t = (-.b -. (sqrt discriminant)) /. a in if (t < tmax && t > tmin) then let p = Ray.point_at_parameter ray t in - { t = t; - p = p; - normal = unit_vector (sub p sphere.center); - hit = true } - else no_hit - else no_hit + Some { t = t; + p = p; + normal = unit_vector (sub p sphere.center); } + else None + else None let rec hit_world world ray (tmin, tmax) = - let init_rec = { t = tmax; - p = Vec3.of_floats (-1., -1., -1.); - normal = Vec3.of_floats (-1., -1., -1.); - hit = false; } in List.fold world - ~init: init_rec - ~f: (fun acc h -> - let hit_rec = (hit h ray (tmin, acc.t)) in - if (hit_rec.hit) - then hit_rec - else acc) + ~init: None + ~f: (fun acc h -> + let prev_rec = match acc with + None -> { t = tmax; + p = Vec3.of_floats (-1., -1., -1.); + normal = Vec3.of_floats (-1., -1., -1.); } + | Some r -> r in + match (hit h ray (tmin, prev_rec.t)) with + Some r -> Some r + | None -> acc) + and hit h ray (tmin, tmax) = match h with Sphere s -> hit_sphere s ray (tmin, tmax) @@ -72,13 +68,19 @@ let get_color ray = radius = 0.5 } in let sphere2 = Sphere {center = Vec3.of_floats (0., -100.5, -1.); radius = 100.0 } in - let world = World [sphere1; sphere2] in - let hit_result = (hit world ray (0., Float.infinity)) in - let t = hit_result.t in - if (hit_result.hit && (t > 0.0)) - then let n = hit_result.normal in - mul 0.5 (Vec3.of_floats (n.x +. 1., n.y +. 1., n.z +. 1.)) - else let unit_direction = unit_vector ray.dir in + let world = World [sphere2; sphere1] in + + match (hit world ray (0., Float.infinity)) with + Some hit_result -> + let t = hit_result.t in + if (t > 0.0) + then let n = hit_result.normal in + mul 0.5 (Vec3.of_floats (n.x +. 1., n.y +. 1., n.z +. 1.)) + else let unit_direction = unit_vector ray.dir in + let t = 0.5 *. (unit_direction.y +. 1.0) in + add (mul (1.0 -. t) {x= 1.0; y=1.0; z= 1.0}) (mul t {x= 0.5; y= 0.7; z= 1.0}) + | None -> + let unit_direction = unit_vector ray.dir in let t = 0.5 *. (unit_direction.y +. 1.0) in add (mul (1.0 -. t) {x= 1.0; y=1.0; z= 1.0}) (mul t {x= 0.5; y= 0.7; z= 1.0}) From 2d940e4c5e1edbdc2a71e14e4ba6362c65ddffef Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Fri, 11 Mar 2016 18:43:14 +0545 Subject: [PATCH 07/27] Antialiasing by super-sampling. --- src/raytracer.ml | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 80da2b25..10b36daf 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -68,7 +68,10 @@ let get_color ray = radius = 0.5 } in let sphere2 = Sphere {center = Vec3.of_floats (0., -100.5, -1.); radius = 100.0 } in - let world = World [sphere2; sphere1] in + let sphere3 = Sphere {center = Vec3.of_floats (-1.0, -0.75, -2.); + radius = 0.25 } in + + let world = World [sphere2; sphere1; sphere3] in match (hit world ray (0., Float.infinity)) with Some hit_result -> @@ -86,8 +89,11 @@ let get_color ray = let write_to_file filename = + Random.self_init (); + let nx = 200 in let ny = 100 in + let ns = 100 in let oc = Out_channel.create filename in fprintf oc "P3\n"; fprintf oc "%d\n" nx; @@ -97,16 +103,22 @@ let write_to_file filename = let horizontal = Vec3.of_floats (4., 0., 0.) in let vertical = Vec3.of_floats (0., 2., 0.) in let origin = Vec3.of_floats (0., 0., 0.) in - let color = ref {x=0.; y=0.; z=0.} in + for j = ny downto 1 do for i = 0 to nx-1 do - let u = (Float.of_int i) /. (Float.of_int nx) in - let v = (Float.of_int j) /. (Float.of_int ny) in + let color = ref {x=0.; y=0.; z=0.} in + for s = 0 to ns-1 do + (* NOTE: Random.float is bounds __inclusive__ *) + let u = (Float.of_int i +. (Random.float 1.0)) /. (Float.of_int nx) in + let v = (Float.of_int j +. (Random.float 1.0)) /. (Float.of_int ny) in - let r = { origin = origin; - dir = Vec3.add lower_left_corner (Vec3.add (Vec3.mul u horizontal) (Vec3.mul v vertical)) } in - color := get_color r; + let r = { origin = origin; + dir = Vec3.add lower_left_corner (Vec3.add (Vec3.mul u horizontal) (Vec3.mul v vertical)) } in + color := Vec3.add !color (get_color r); + done; + + color := Vec3.mul (1. /. (Float.of_int ns)) !color ; let {x=r; y=g; z=b} = !color in let (ir, ig, ib) = (Int.of_float (r*.255.99), Int.of_float (g*.255.99), From 7b01a47c16f57ca3518390bec11ee5ed1e48b998 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Fri, 11 Mar 2016 18:44:27 +0545 Subject: [PATCH 08/27] Remove `main` for now --- src/raytracer.ml | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 10b36daf..6621387a 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -130,40 +130,3 @@ let write_to_file filename = done; Out_channel.close oc; ;; - - -let main() = - let nx = 200 in - let ny = 100 in - print_string "P3\n"; - printf "%d\n" nx; - printf "%d\n" ny; - print_string "\n255\n"; - - let lower_left_corner = Vec3.of_floats (-2., -1., -1.) in - let horizontal = Vec3.of_floats (4., 0., 0.) in - let vertical = Vec3.of_floats (0., 2., 0.) in - let origin = Vec3.of_floats (0., 0., 0.) in - let color = ref {x=0.; y=0.; z=0.} in - for j = ny downto 1 do - for i = 0 to nx-1 do - let u = (Float.of_int i) /. (Float.of_int nx) in - let v = (Float.of_int j) /. (Float.of_int ny) in - - let r = { origin = origin; - dir = Vec3.add lower_left_corner (Vec3.add (Vec3.mul u horizontal) (Vec3.mul v vertical)) } in - color := get_color r; - - let {x=r; y=g; z=b} = !color in - let (ir, ig, ib) = (Int.of_float (r*.255.99), - Int.of_float (g*.255.99), - Int.of_float (b*.255.99)) in - printf "%d " ir; - printf "%d " ig; - printf "%d " ib; - print_newline(); - done - done -;; - -(* main() *) From 7b75b7c2fc3a0dc0dbd0c5cbac5588cd75325f8e Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Fri, 11 Mar 2016 19:06:23 +0545 Subject: [PATCH 09/27] Avoid initializing `world` in each call to get_color --- src/raytracer.ml | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 6621387a..582d6903 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -63,16 +63,7 @@ and hit h ray (tmin, tmax) = | World w -> hit_world w ray (tmin, tmax) -let get_color ray = - let sphere1 = Sphere {center = Vec3.of_floats (0., 0., -1.); - radius = 0.5 } in - let sphere2 = Sphere {center = Vec3.of_floats (0., -100.5, -1.); - radius = 100.0 } in - let sphere3 = Sphere {center = Vec3.of_floats (-1.0, -0.75, -2.); - radius = 0.25 } in - - let world = World [sphere2; sphere1; sphere3] in - +let get_color world ray = match (hit world ray (0., Float.infinity)) with Some hit_result -> let t = hit_result.t in @@ -90,6 +81,14 @@ let get_color ray = let write_to_file filename = Random.self_init (); + + let sphere1 = Sphere {center = Vec3.of_floats (0., 0., -1.); + radius = 0.5 } in + let sphere2 = Sphere {center = Vec3.of_floats (0., -100.5, -1.); + radius = 100.0 } in + let sphere3 = Sphere {center = Vec3.of_floats (-1.0, -0.75, -2.); + radius = 0.25 } in + let world = World [sphere2; sphere1; sphere3] in let nx = 200 in let ny = 100 in @@ -114,7 +113,7 @@ let write_to_file filename = let r = { origin = origin; dir = Vec3.add lower_left_corner (Vec3.add (Vec3.mul u horizontal) (Vec3.mul v vertical)) } in - color := Vec3.add !color (get_color r); + color := Vec3.add !color (get_color world r); done; From 612e9d8af083df9352f1b3bafcc86b12e659e407 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sat, 12 Mar 2016 15:24:17 +0545 Subject: [PATCH 10/27] Diffuse materials --- src/raytracer.ml | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 582d6903..739d9488 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -15,6 +15,19 @@ type hit_rec = { t : float; type hit = hit_rec option +let random_in_unit_sphere () = + let p = ref (Vec3.of_floats ((Random.float 1.0), + (Random.float 1.0), + (Random.float 1.0))) in + while ((Vec3.dot !p !p) >= 1.0) do + p := Vec3.mul 2.0 (Vec3.sub (Vec3.of_floats ((Random.float 1.0), + (Random.float 1.0), + (Random.float 1.0))) + (Vec3.of_floats (1., 1., 1.))) + done; + !p +;; + let hit_sphere sphere ray (tmin, tmax) = let oc = sub ray.origin sphere.center in @@ -63,16 +76,13 @@ and hit h ray (tmin, tmax) = | World w -> hit_world w ray (tmin, tmax) -let get_color world ray = +let rec get_color world ray = match (hit world ray (0., Float.infinity)) with Some hit_result -> - let t = hit_result.t in - if (t > 0.0) - then let n = hit_result.normal in - mul 0.5 (Vec3.of_floats (n.x +. 1., n.y +. 1., n.z +. 1.)) - else let unit_direction = unit_vector ray.dir in - let t = 0.5 *. (unit_direction.y +. 1.0) in - add (mul (1.0 -. t) {x= 1.0; y=1.0; z= 1.0}) (mul t {x= 0.5; y= 0.7; z= 1.0}) + let target = Vec3.add (Vec3.add hit_result.p hit_result.normal) + (random_in_unit_sphere ()) in + Vec3.mul 0.5 (get_color world {origin = hit_result.p; + dir = Vec3.sub target hit_result.p}) | None -> let unit_direction = unit_vector ray.dir in let t = 0.5 *. (unit_direction.y +. 1.0) in From c092de81ce3a5539b74a81d951e6bcb17842b443 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sat, 12 Mar 2016 19:23:13 +0545 Subject: [PATCH 11/27] Gamma correction --- src/raytracer.ml | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 739d9488..d88fc484 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -16,14 +16,15 @@ type hit_rec = { t : float; type hit = hit_rec option let random_in_unit_sphere () = - let p = ref (Vec3.of_floats ((Random.float 1.0), - (Random.float 1.0), - (Random.float 1.0))) in + let p = ref (Vec3.sub (Vec3.mul 2.0 (Vec3.of_floats ((Random.float 1.0), + (Random.float 1.0), + (Random.float 1.0)))) + (Vec3.of_floats (1., 1., 1.))) in while ((Vec3.dot !p !p) >= 1.0) do - p := Vec3.mul 2.0 (Vec3.sub (Vec3.of_floats ((Random.float 1.0), + p := Vec3.sub (Vec3.mul 2.0 (Vec3.of_floats ((Random.float 1.0), (Random.float 1.0), - (Random.float 1.0))) - (Vec3.of_floats (1., 1., 1.))) + (Random.float 1.0)))) + (Vec3.of_floats (1., 1., 1.)) done; !p ;; @@ -38,22 +39,22 @@ let hit_sphere sphere ray (tmin, tmax) = if (discriminant > 0.0) then - let t = (-.b +. (sqrt discriminant)) /. a in + let t = (-.b -. (sqrt discriminant)) /. a in if (t < tmax && t > tmin) then let p = Ray.point_at_parameter ray t in Some { t = t; p = p; - normal = unit_vector (sub p sphere.center); } + normal = mul (1. /. sphere.radius) (sub p sphere.center); } else - let t = (-.b -. (sqrt discriminant)) /. a in + let t = (-.b +. (sqrt discriminant)) /. a in if (t < tmax && t > tmin) then let p = Ray.point_at_parameter ray t in Some { t = t; p = p; - normal = unit_vector (sub p sphere.center); } + normal = mul (1. /. sphere.radius) (sub p sphere.center); } else None else None @@ -78,7 +79,7 @@ and hit h ray (tmin, tmax) = let rec get_color world ray = match (hit world ray (0., Float.infinity)) with - Some hit_result -> + Some hit_result -> let target = Vec3.add (Vec3.add hit_result.p hit_result.normal) (random_in_unit_sphere ()) in Vec3.mul 0.5 (get_color world {origin = hit_result.p; @@ -128,6 +129,10 @@ let write_to_file filename = done; color := Vec3.mul (1. /. (Float.of_int ns)) !color ; + (* gamma correction *) + color := Vec3.of_floats (sqrt(!color.x), + sqrt(!color.y), + sqrt(!color.z)); let {x=r; y=g; z=b} = !color in let (ir, ig, ib) = (Int.of_float (r*.255.99), Int.of_float (g*.255.99), @@ -139,3 +144,7 @@ let write_to_file filename = done; Out_channel.close oc; ;; + +let () = + write_to_file "matte.ppm" +;; From bb4354a6e5bd8abd7883bc396bc43cb4d5df778d Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Thu, 23 Jun 2016 21:15:24 +0545 Subject: [PATCH 12/27] Update `make display` target --- src/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Makefile b/src/Makefile index 4dc45a53..4e2241d9 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,5 @@ build: ocamlbuild -use-ocamlfind -package core -tag thread raytracer.native display: build - ./raytracer.native > foo.ppm - display foo.ppm + ./raytracer.native + display matte.ppm From 1ca0d7a9ea29df6b9d6eae6dd71a7483934bdf4d Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Thu, 23 Jun 2016 23:11:28 +0545 Subject: [PATCH 13/27] Add a README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..517e2520 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# rayml + +A raytracer written in OCaml, following Peter Shirley's mini-book +series [Raytracing in One Weekend][weekend]. + +[weekend]: http://in1weekend.blogspot.com/2016/01/ray-tracing-in-one-weekend.html From 4391e3380caacb88f7ca6131f83f1f47ae694b49 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sat, 25 Jun 2016 17:17:52 +0545 Subject: [PATCH 14/27] Materials; with metal and lambertian materials --- src/ray.ml | 5 ++++ src/raytracer.ml | 77 ++++++++++++++++++++++++++++++++++++------------ src/vec3.ml | 6 ++++ src/vec3.mli | 1 + 4 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/ray.ml b/src/ray.ml index 8a392d1d..10eece06 100644 --- a/src/ray.ml +++ b/src/ray.ml @@ -3,3 +3,8 @@ type ray = { origin: Vec3.vec3; let point_at_parameter r t = Vec3.add r.origin (Vec3.mul t r.dir) + +let create o d = + { origin = o; + dir = d } +;; diff --git a/src/raytracer.ml b/src/raytracer.ml index d88fc484..1882d4d0 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -3,15 +3,23 @@ open Printf open Vec3 open Ray +type material = Lambertian of Vec3.vec3 + | Metal of Vec3.vec3 + | DummyNone + type sphere = { center: Vec3.vec3; - radius: float } + radius: float; + mat: material; + } type hitable = Sphere of sphere | World of hitable list + type hit_rec = { t : float; p: Vec3.vec3; - normal: Vec3.vec3; } + normal: Vec3.vec3; + mat: material; } type hit = hit_rec option @@ -23,12 +31,32 @@ let random_in_unit_sphere () = while ((Vec3.dot !p !p) >= 1.0) do p := Vec3.sub (Vec3.mul 2.0 (Vec3.of_floats ((Random.float 1.0), (Random.float 1.0), - (Random.float 1.0)))) + (Random.float 1.0)))) (Vec3.of_floats (1., 1., 1.)) done; !p ;; +type scatter = { ray : Ray.ray; + color: Vec3.vec3; } + +let reflect v n = + Vec3.sub v (Vec3.mul (2. *. (Vec3.dot v n)) n) + +let hit_scatter rin hit_rec = + match hit_rec.mat with + Lambertian albedo -> + let target = (Vec3.add (Vec3.add hit_rec.p hit_rec.normal) (random_in_unit_sphere ())) in + let scatter = { ray = Ray.create hit_rec.p (Vec3.sub target hit_rec.p); + color = albedo; } + in scatter + (* TODO: C++ version returns boolean here *) + | Metal albedo -> + let reflected = reflect (Vec3.unit_vector rin.dir) hit_rec.normal in + let scattered = { ray = Ray.create hit_rec.p reflected; + color = albedo; } in + scattered +;; let hit_sphere sphere ray (tmin, tmax) = let oc = sub ray.origin sphere.center in @@ -46,7 +74,9 @@ let hit_sphere sphere ray (tmin, tmax) = let p = Ray.point_at_parameter ray t in Some { t = t; p = p; - normal = mul (1. /. sphere.radius) (sub p sphere.center); } + normal = mul (1. /. sphere.radius) (sub p sphere.center); + mat = sphere.mat + } else let t = (-.b +. (sqrt discriminant)) /. a in if (t < tmax && t > tmin) @@ -54,7 +84,9 @@ let hit_sphere sphere ray (tmin, tmax) = let p = Ray.point_at_parameter ray t in Some { t = t; p = p; - normal = mul (1. /. sphere.radius) (sub p sphere.center); } + normal = mul (1. /. sphere.radius) (sub p sphere.center); + mat = sphere.mat; + } else None else None @@ -65,7 +97,8 @@ let rec hit_world world ray (tmin, tmax) = let prev_rec = match acc with None -> { t = tmax; p = Vec3.of_floats (-1., -1., -1.); - normal = Vec3.of_floats (-1., -1., -1.); } + normal = Vec3.of_floats (-1., -1., -1.); + mat = DummyNone} | Some r -> r in match (hit h ray (tmin, prev_rec.t)) with Some r -> Some r @@ -77,13 +110,13 @@ and hit h ray (tmin, tmax) = | World w -> hit_world w ray (tmin, tmax) -let rec get_color world ray = +let rec get_color world ray depth = match (hit world ray (0., Float.infinity)) with Some hit_result -> - let target = Vec3.add (Vec3.add hit_result.p hit_result.normal) - (random_in_unit_sphere ()) in - Vec3.mul 0.5 (get_color world {origin = hit_result.p; - dir = Vec3.sub target hit_result.p}) + if (depth < 50) + then let s = hit_scatter ray hit_result in + Vec3.pmul s.color (get_color world s.ray (depth+1)) + else Vec3.of_floats (0., 0., 0.) | None -> let unit_direction = unit_vector ray.dir in let t = 0.5 *. (unit_direction.y +. 1.0) in @@ -94,15 +127,21 @@ let write_to_file filename = Random.self_init (); let sphere1 = Sphere {center = Vec3.of_floats (0., 0., -1.); - radius = 0.5 } in + radius = 0.5; + mat = Lambertian (Vec3.of_floats (0.8, 0.3, 0.3)) } in let sphere2 = Sphere {center = Vec3.of_floats (0., -100.5, -1.); - radius = 100.0 } in - let sphere3 = Sphere {center = Vec3.of_floats (-1.0, -0.75, -2.); - radius = 0.25 } in - let world = World [sphere2; sphere1; sphere3] in + radius = 100.0; + mat = Lambertian (Vec3.of_floats (0.8, 0.8, 0.0))} in + let sphere3 = Sphere {center = Vec3.of_floats (-1.0, 0., -1.); + radius = 0.5; + mat = Metal (Vec3.of_floats (0.8, 0.6, 0.2))} in + let sphere4 = Sphere {center = Vec3.of_floats (1.0, 0., -1.); + radius = 0.5; + mat = Metal (Vec3.of_floats (0.8, 0.8, 0.8))} in + let world = World [sphere3; sphere2; sphere1; sphere4] in - let nx = 200 in - let ny = 100 in + let nx = 400 in + let ny = 200 in let ns = 100 in let oc = Out_channel.create filename in fprintf oc "P3\n"; @@ -124,7 +163,7 @@ let write_to_file filename = let r = { origin = origin; dir = Vec3.add lower_left_corner (Vec3.add (Vec3.mul u horizontal) (Vec3.mul v vertical)) } in - color := Vec3.add !color (get_color world r); + color := Vec3.add !color (get_color world r 0); done; diff --git a/src/vec3.ml b/src/vec3.ml index 663a041a..8d24dfeb 100644 --- a/src/vec3.ml +++ b/src/vec3.ml @@ -36,3 +36,9 @@ let mul t v = { x = t *. v.x; y = t *. v.y; z = t *. v.z } + +(* pairwise multiplication *) +let pmul v w = + { x = v.x *. w.x; + y = v.y *. w.y; + z = v.z *. w.z; } diff --git a/src/vec3.mli b/src/vec3.mli index d29871fa..10861db0 100644 --- a/src/vec3.mli +++ b/src/vec3.mli @@ -9,3 +9,4 @@ val dot : vec3 -> vec3 -> float val cross: vec3 -> vec3 -> vec3 val mul : float -> vec3 -> vec3 val unit_vector : vec3 -> vec3 +val pmul : vec3 -> vec3 -> vec3 From dbb66fe05d5c00e1913790feb08605dced17587c Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Wed, 29 Jun 2016 09:54:22 +0545 Subject: [PATCH 15/27] hit_scatter also returns a bool --- src/raytracer.ml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 1882d4d0..c388234c 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -21,6 +21,10 @@ type hit_rec = { t : float; normal: Vec3.vec3; mat: material; } +type scatter = { ray : Ray.ray; + color: Vec3.vec3; + scatter: bool;} + type hit = hit_rec option let random_in_unit_sphere () = @@ -37,9 +41,6 @@ let random_in_unit_sphere () = !p ;; -type scatter = { ray : Ray.ray; - color: Vec3.vec3; } - let reflect v n = Vec3.sub v (Vec3.mul (2. *. (Vec3.dot v n)) n) @@ -48,13 +49,15 @@ let hit_scatter rin hit_rec = Lambertian albedo -> let target = (Vec3.add (Vec3.add hit_rec.p hit_rec.normal) (random_in_unit_sphere ())) in let scatter = { ray = Ray.create hit_rec.p (Vec3.sub target hit_rec.p); - color = albedo; } + color = albedo; + scatter = true;} in scatter - (* TODO: C++ version returns boolean here *) | Metal albedo -> let reflected = reflect (Vec3.unit_vector rin.dir) hit_rec.normal in - let scattered = { ray = Ray.create hit_rec.p reflected; - color = albedo; } in + let scattered_ray = Ray.create hit_rec.p reflected in + let scattered = { ray = scattered_ray; + color = albedo; + scatter = (Vec3.dot scattered_ray.dir hit_rec.normal) > 0.0;} in scattered ;; From e3218f97418271b9e782abf02930da9d723352bf Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sun, 3 Sep 2017 23:40:30 +0545 Subject: [PATCH 16/27] Update README; code style changes --- README.md | 2 ++ examples/demo.jpg | Bin 0 -> 74821 bytes src/raytracer.ml | 17 ++++++++--------- 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 examples/demo.jpg diff --git a/README.md b/README.md index 517e2520..d0745c68 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # rayml +![Example rendered scene](examples/demo.jpg) + A raytracer written in OCaml, following Peter Shirley's mini-book series [Raytracing in One Weekend][weekend]. diff --git a/examples/demo.jpg b/examples/demo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f79c7937346e5bd1e902bc63bb4705ca26629b4 GIT binary patch literal 74821 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 E*~w{F$p8QV literal 0 HcmV?d00001 diff --git a/src/raytracer.ml b/src/raytracer.ml index c388234c..56d4345e 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -3,7 +3,7 @@ open Printf open Vec3 open Ray -type material = Lambertian of Vec3.vec3 +type material = Lambertian of Vec3.vec3 (* matte surface *) | Metal of Vec3.vec3 | DummyNone @@ -46,20 +46,19 @@ let reflect v n = let hit_scatter rin hit_rec = match hit_rec.mat with - Lambertian albedo -> + Lambertian(albedo) -> let target = (Vec3.add (Vec3.add hit_rec.p hit_rec.normal) (random_in_unit_sphere ())) in let scatter = { ray = Ray.create hit_rec.p (Vec3.sub target hit_rec.p); color = albedo; scatter = true;} in scatter - | Metal albedo -> + | Metal(albedo) -> 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 = scattered_ray; color = albedo; scatter = (Vec3.dot scattered_ray.dir hit_rec.normal) > 0.0;} in scattered -;; let hit_sphere sphere ray (tmin, tmax) = let oc = sub ray.origin sphere.center in @@ -102,15 +101,15 @@ let rec hit_world world ray (tmin, tmax) = p = Vec3.of_floats (-1., -1., -1.); normal = Vec3.of_floats (-1., -1., -1.); mat = DummyNone} - | Some r -> r in + | Some(r) -> r in match (hit h ray (tmin, prev_rec.t)) with - Some r -> Some r + Some(r) -> Some r | None -> acc) and hit h ray (tmin, tmax) = match h with - Sphere s -> hit_sphere s ray (tmin, tmax) - | World w -> hit_world w ray (tmin, tmax) + Sphere(s) -> hit_sphere s ray (tmin, tmax) + | World(w) -> hit_world w ray (tmin, tmax) let rec get_color world ray depth = @@ -188,5 +187,5 @@ let write_to_file filename = ;; let () = - write_to_file "matte.ppm" + write_to_file "out.ppm" ;; From b9c9bcaf6dd21ed3ea9e17f8382f563493b7e86f Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sun, 3 Sep 2017 23:51:26 +0545 Subject: [PATCH 17/27] Move makefile to toplevel dir --- Makefile | 9 +++++++++ src/Makefile | 5 ----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 Makefile delete mode 100644 src/Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..5db93f58 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +build: + ocamlbuild -use-ocamlfind -package core -tag thread -I src/ raytracer.native + chmod +x raytracer.native +clean: + ocamlbuild -clean + rm out.ppm +display: build + ./raytracer.native + display out.ppm diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 4e2241d9..00000000 --- a/src/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -build: - ocamlbuild -use-ocamlfind -package core -tag thread raytracer.native -display: build - ./raytracer.native - display matte.ppm From 22a67f299000e444e2931bd4750b493b7edd904b Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sun, 3 Sep 2017 23:51:46 +0545 Subject: [PATCH 18/27] Handle DummyNone case --- src/raytracer.ml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 56d4345e..14f7e771 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -1,11 +1,11 @@ -open Core.Std +open Core open Printf open Vec3 open Ray type material = Lambertian of Vec3.vec3 (* matte surface *) | Metal of Vec3.vec3 - | DummyNone + | DummyNone (* TODO: use option type instead *) type sphere = { center: Vec3.vec3; radius: float; @@ -59,6 +59,7 @@ let hit_scatter rin hit_rec = color = albedo; scatter = (Vec3.dot scattered_ray.dir hit_rec.normal) > 0.0;} in scattered + | DummyNone -> failwith "not a real material type" let hit_sphere sphere ray (tmin, tmax) = let oc = sub ray.origin sphere.center in @@ -144,7 +145,7 @@ let write_to_file filename = let nx = 400 in let ny = 200 in - let ns = 100 in + let ns = 60 in let oc = Out_channel.create filename in fprintf oc "P3\n"; fprintf oc "%d\n" nx; From ec8480f231183f731bba6712077fa388499c3aba Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Mon, 4 Sep 2017 23:59:58 +0545 Subject: [PATCH 19/27] More functional `random_in_unit_sphere` - And add more comments --- src/raytracer.ml | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 14f7e771..6f8ae52c 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -27,31 +27,30 @@ type scatter = { ray : Ray.ray; type hit = hit_rec option -let random_in_unit_sphere () = - let p = ref (Vec3.sub (Vec3.mul 2.0 (Vec3.of_floats ((Random.float 1.0), - (Random.float 1.0), - (Random.float 1.0)))) - (Vec3.of_floats (1., 1., 1.))) in - while ((Vec3.dot !p !p) >= 1.0) do - p := Vec3.sub (Vec3.mul 2.0 (Vec3.of_floats ((Random.float 1.0), - (Random.float 1.0), - (Random.float 1.0)))) - (Vec3.of_floats (1., 1., 1.)) - done; - !p -;; +(* Produce a random point inside the unit sphere. Works by picking a + random point in the unit cube, rejecting if not inside the sphere. *) +let rec random_in_unit_sphere () = + let p = (Vec3.sub (Vec3.mul 2.0 (Vec3.of_floats ((Random.float 1.0), + (Random.float 1.0), + (Random.float 1.0)))) + (Vec3.of_floats (1., 1., 1.))) in + if ((Vec3.dot p p) >= 1.0) + then p + else random_in_unit_sphere () let reflect v n = Vec3.sub v (Vec3.mul (2. *. (Vec3.dot v n)) n) let hit_scatter rin hit_rec = match hit_rec.mat with + (* reflect in random direction *) Lambertian(albedo) -> let target = (Vec3.add (Vec3.add hit_rec.p hit_rec.normal) (random_in_unit_sphere ())) in let scatter = { ray = Ray.create hit_rec.p (Vec3.sub target hit_rec.p); color = albedo; scatter = true;} in scatter + (* "shiny"- angle of reflectance = angle of incidence *) | Metal(albedo) -> let reflected = reflect (Vec3.unit_vector rin.dir) hit_rec.normal in let scattered_ray = Ray.create hit_rec.p reflected in @@ -182,11 +181,10 @@ let write_to_file filename = fprintf oc "%d " ir; fprintf oc "%d " ig; fprintf oc "%d \n" ib; - done + done; done; - Out_channel.close oc; -;; + Out_channel.close oc let () = write_to_file "out.ppm" -;; + From 1f9994d4f0cde3306010e3caab97b57d29a6c194 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Tue, 5 Sep 2017 10:45:33 +0545 Subject: [PATCH 20/27] Add "fuzz" to metals --- src/raytracer.ml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index 6f8ae52c..dd3f0b69 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -3,8 +3,8 @@ open Printf open Vec3 open Ray -type material = Lambertian of Vec3.vec3 (* matte surface *) - | Metal of Vec3.vec3 +type material = Lambertian of Vec3.vec3 (* albedo *) + | Metal of Vec3.vec3 * float (* albedo, fuzz *) | DummyNone (* TODO: use option type instead *) type sphere = { center: Vec3.vec3; @@ -51,9 +51,9 @@ let hit_scatter rin hit_rec = scatter = true;} in scatter (* "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 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; color = albedo; 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 let sphere3 = Sphere {center = Vec3.of_floats (-1.0, 0., -1.); 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.); 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 nx = 400 in let ny = 200 in - let ns = 60 in + let ns = 150 in (* samples per pixel *) let oc = Out_channel.create filename in fprintf oc "P3\n"; fprintf oc "%d\n" nx; From 9e303e14b275f24c33e7fa00dc7ec3dd8d7df72d Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Wed, 15 Nov 2017 14:49:36 +0545 Subject: [PATCH 21/27] Edit README --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d0745c68..4cd8ac97 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,12 @@ ![Example rendered scene](examples/demo.jpg) -A raytracer written in OCaml, following Peter Shirley's mini-book -series [Raytracing in One Weekend][weekend]. +A raytracer written in OCaml. It supports diffuse("matte") and +reflective("metallic") surfaces. + +The design of the software roughly follows Peter Shirley's mini-book +series [Raytracing in One Weekend][weekend] which presents a raytracer +in C++. I've adopted the programming style to suit the OCaml's +functional style. [weekend]: http://in1weekend.blogspot.com/2016/01/ray-tracing-in-one-weekend.html From 5e44c0b22aa3bfd854ab9f5ca514e6d906c5a790 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Wed, 15 Nov 2017 14:52:09 +0545 Subject: [PATCH 22/27] Add Usage notes --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 4cd8ac97..9ebc08d7 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,9 @@ series [Raytracing in One Weekend][weekend] which presents a raytracer in C++. I've adopted the programming style to suit the OCaml's functional style. +## Usage + +You need to have OCaml installed. Running `make display` will compile +the program and renders the hard-coded scene displayed above. + [weekend]: http://in1weekend.blogspot.com/2016/01/ray-tracing-in-one-weekend.html From 552a70e6bd3858d9c60919a857411954a6c0ae65 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Wed, 15 Nov 2017 16:12:12 +0545 Subject: [PATCH 23/27] Remove DummyNone material; start work on dielectric material --- src/raytracer.ml | 56 +++++++++++++++++++++++++++++++++++++----------- src/vec3.ml | 3 +++ src/vec3.mli | 1 + 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/raytracer.ml b/src/raytracer.ml index dd3f0b69..f8736343 100644 --- a/src/raytracer.ml +++ b/src/raytracer.ml @@ -5,7 +5,7 @@ open Ray type material = Lambertian of Vec3.vec3 (* albedo *) | Metal of Vec3.vec3 * float (* albedo, fuzz *) - | DummyNone (* TODO: use option type instead *) + | Dielectric of float (* refractive index *) type sphere = { center: Vec3.vec3; radius: float; @@ -19,7 +19,7 @@ type hitable = Sphere of sphere type hit_rec = { t : float; p: Vec3.vec3; normal: Vec3.vec3; - mat: material; } + mat: material option; } type scatter = { ray : Ray.ray; color: Vec3.vec3; @@ -41,24 +41,51 @@ let rec random_in_unit_sphere () = let reflect v n = Vec3.sub v (Vec3.mul (2. *. (Vec3.dot v n)) n) -let hit_scatter rin hit_rec = +let refract v n ni_over_nt = + let uv = Vec3.unit_vector v in + let dt = Vec3.dot uv n in + let discriminant = 1.0 -. ((ni_over_nt*.ni_over_nt) *. (1.0 -. dt*.dt)) in + if discriminant > 0.0 + then + let refracted = (Vec3.sub (Vec3.mul ni_over_nt (Vec3.sub v (Vec3.mul dt n))) (Vec3.mul (sqrt discriminant) n)) in + Some(refracted) + else None + +let hit_scatter r_in hit_rec = match hit_rec.mat with (* reflect in random direction *) - Lambertian(albedo) -> + Some(Lambertian(albedo)) -> let target = (Vec3.add (Vec3.add hit_rec.p hit_rec.normal) (random_in_unit_sphere ())) in let scatter = { ray = Ray.create hit_rec.p (Vec3.sub target hit_rec.p); color = albedo; scatter = true;} in scatter (* "shiny"- angle of reflectance = angle of incidence *) - | Metal(albedo, fuzz) -> - let reflected = reflect (Vec3.unit_vector rin.dir) hit_rec.normal in + | Some(Metal(albedo, fuzz)) -> + let reflected = reflect (Vec3.unit_vector r_in.dir) hit_rec.normal 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; color = albedo; scatter = (Vec3.dot scattered_ray.dir hit_rec.normal) > 0.0;} in scattered - | DummyNone -> failwith "not a real material type" + + | Some(Dielectric(ref_idx)) -> + let reflected = reflect (Vec3.unit_vector r_in.dir) hit_rec.normal in + let attenuation = Vec3.of_floats (1.0, 1.0, 1.0) in + let (outward_normal, ni_over_nt) = + if (Vec3.dot r_in.dir hit_rec.normal) > 0.0 + then (Vec3.neg hit_rec.normal, ref_idx) + else (hit_rec.normal, 1.0 /. ref_idx) in + let scattered_ray = + match (refract r_in.dir outward_normal ni_over_nt) with + | Some(refracted) -> Ray.create hit_rec.p refracted + | None -> Ray.create hit_rec.p reflected in + let scattered = + { ray= scattered_ray; + color= attenuation; + scatter = false; } in + scattered + | None -> failwith "not a real material type" let hit_sphere sphere ray (tmin, tmax) = let oc = sub ray.origin sphere.center in @@ -77,7 +104,7 @@ let hit_sphere sphere ray (tmin, tmax) = Some { t = t; p = p; normal = mul (1. /. sphere.radius) (sub p sphere.center); - mat = sphere.mat + mat = Some(sphere.mat) } else let t = (-.b +. (sqrt discriminant)) /. a in @@ -87,7 +114,7 @@ let hit_sphere sphere ray (tmin, tmax) = Some { t = t; p = p; normal = mul (1. /. sphere.radius) (sub p sphere.center); - mat = sphere.mat; + mat = Some(sphere.mat); } else None else None @@ -100,7 +127,7 @@ let rec hit_world world ray (tmin, tmax) = None -> { t = tmax; p = Vec3.of_floats (-1., -1., -1.); normal = Vec3.of_floats (-1., -1., -1.); - mat = DummyNone} + mat = None } | Some(r) -> r in match (hit h ray (tmin, prev_rec.t)) with Some(r) -> Some r @@ -137,10 +164,13 @@ let write_to_file filename = let sphere3 = Sphere {center = Vec3.of_floats (-1.0, 0., -1.); radius = 0.5; 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; *) + (* mat = Metal ((Vec3.of_floats (0.8, 0.8, 0.8)), 0.1)} in *) + let sphere4 = Sphere {center = Vec3.of_floats (1.0, 0.0, -1.); radius = 0.5; - mat = Metal ((Vec3.of_floats (0.8, 0.8, 0.8)), 0.1)} in - let world = World [sphere3; sphere2; sphere1; sphere4] in + mat = Dielectric (1.5)} in + let world = World [sphere3; sphere2; sphere1; sphere4;] in let nx = 400 in let ny = 200 in diff --git a/src/vec3.ml b/src/vec3.ml index 8d24dfeb..98f79d74 100644 --- a/src/vec3.ml +++ b/src/vec3.ml @@ -15,6 +15,9 @@ let sub v w = y = v.y -. w.y; z = v.z -. w.z} +let neg v = + sub {x= 0.0; y=0.0; z=0.0} v + let dot v w = v.x*.w.x +. v.y*.w.y +.v.z*.w.z diff --git a/src/vec3.mli b/src/vec3.mli index 10861db0..38421dd4 100644 --- a/src/vec3.mli +++ b/src/vec3.mli @@ -5,6 +5,7 @@ type vec3 = { x: float; val of_floats : float * float * float -> vec3 val add : vec3 -> vec3 -> vec3 val sub : vec3 -> vec3 -> vec3 +val neg : vec3 -> vec3 val dot : vec3 -> vec3 -> float val cross: vec3 -> vec3 -> vec3 val mul : float -> vec3 -> vec3 From 22776bf4ffd29c5f9d6bb325b457ea0c59ef5fe4 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Thu, 16 Nov 2017 20:33:38 +0545 Subject: [PATCH 24/27] Grammar fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9ebc08d7..5aa9d84e 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ reflective("metallic") surfaces. The design of the software roughly follows Peter Shirley's mini-book series [Raytracing in One Weekend][weekend] which presents a raytracer -in C++. I've adopted the programming style to suit the OCaml's -functional style. +in C++. I've adopted the programming style to suit OCaml's functional +style. ## Usage From ddf0f258c7db7e9df9af046856b7c1193709e119 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Thu, 8 Jun 2023 15:25:06 -0400 Subject: [PATCH 25/27] move files --- {src => benchs/raytracer}/ray.ml | 0 {src => benchs/raytracer}/raytracer.ml | 0 {src => benchs/raytracer}/vec3.ml | 0 {src => benchs/raytracer}/vec3.mli | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {src => benchs/raytracer}/ray.ml (100%) rename {src => benchs/raytracer}/raytracer.ml (100%) rename {src => benchs/raytracer}/vec3.ml (100%) rename {src => benchs/raytracer}/vec3.mli (100%) diff --git a/src/ray.ml b/benchs/raytracer/ray.ml similarity index 100% rename from src/ray.ml rename to benchs/raytracer/ray.ml diff --git a/src/raytracer.ml b/benchs/raytracer/raytracer.ml similarity index 100% rename from src/raytracer.ml rename to benchs/raytracer/raytracer.ml diff --git a/src/vec3.ml b/benchs/raytracer/vec3.ml similarity index 100% rename from src/vec3.ml rename to benchs/raytracer/vec3.ml diff --git a/src/vec3.mli b/benchs/raytracer/vec3.mli similarity index 100% rename from src/vec3.mli rename to benchs/raytracer/vec3.mli From 9218ba8fe6a164dcfadd8f461edf3bc67d559ed2 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Thu, 8 Jun 2023 15:25:33 -0400 Subject: [PATCH 26/27] migrate raytracer to dune --- benchs/raytracer/dune | 4 ++++ benchs/raytracer/raytracer.ml | 10 ++++------ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 benchs/raytracer/dune diff --git a/benchs/raytracer/dune b/benchs/raytracer/dune new file mode 100644 index 00000000..b821229d --- /dev/null +++ b/benchs/raytracer/dune @@ -0,0 +1,4 @@ + +(executable + (name raytracer) + (flags :standard -warn-error -a+8)) diff --git a/benchs/raytracer/raytracer.ml b/benchs/raytracer/raytracer.ml index f8736343..988eee78 100644 --- a/benchs/raytracer/raytracer.ml +++ b/benchs/raytracer/raytracer.ml @@ -1,4 +1,3 @@ -open Core open Printf open Vec3 open Ray @@ -120,9 +119,8 @@ let hit_sphere sphere ray (tmin, tmax) = else None let rec hit_world world ray (tmin, tmax) = - List.fold world - ~init: None - ~f: (fun acc h -> + List.fold_left + (fun acc h -> let prev_rec = match acc with None -> { t = tmax; p = Vec3.of_floats (-1., -1., -1.); @@ -131,7 +129,7 @@ let rec hit_world world ray (tmin, tmax) = | Some(r) -> r in match (hit h ray (tmin, prev_rec.t)) with Some(r) -> Some r - | None -> acc) + | None -> acc) None world and hit h ray (tmin, tmax) = match h with @@ -175,7 +173,7 @@ let write_to_file filename = let nx = 400 in let ny = 200 in let ns = 150 in (* samples per pixel *) - let oc = Out_channel.create filename in + let oc = open_out filename in fprintf oc "P3\n"; fprintf oc "%d\n" nx; fprintf oc "%d\n" ny; From a3cc55c20df9ec2817573de9bf7922a52dc0cbdd Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Thu, 8 Jun 2023 15:27:37 -0400 Subject: [PATCH 27/27] cleanup --- .merlin | 2 -- Makefile | 9 --------- README.md | 18 ------------------ examples/demo.jpg | Bin 74821 -> 0 bytes 4 files changed, 29 deletions(-) delete mode 100644 .merlin delete mode 100644 Makefile delete mode 100644 README.md delete mode 100644 examples/demo.jpg diff --git a/.merlin b/.merlin deleted file mode 100644 index 8235f457..00000000 --- a/.merlin +++ /dev/null @@ -1,2 +0,0 @@ -S src -PKG core diff --git a/Makefile b/Makefile deleted file mode 100644 index 5db93f58..00000000 --- a/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -build: - ocamlbuild -use-ocamlfind -package core -tag thread -I src/ raytracer.native - chmod +x raytracer.native -clean: - ocamlbuild -clean - rm out.ppm -display: build - ./raytracer.native - display out.ppm diff --git a/README.md b/README.md deleted file mode 100644 index 5aa9d84e..00000000 --- a/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# rayml - -![Example rendered scene](examples/demo.jpg) - -A raytracer written in OCaml. It supports diffuse("matte") and -reflective("metallic") surfaces. - -The design of the software roughly follows Peter Shirley's mini-book -series [Raytracing in One Weekend][weekend] which presents a raytracer -in C++. I've adopted the programming style to suit OCaml's functional -style. - -## Usage - -You need to have OCaml installed. Running `make display` will compile -the program and renders the hard-coded scene displayed above. - -[weekend]: http://in1weekend.blogspot.com/2016/01/ray-tracing-in-one-weekend.html diff --git a/examples/demo.jpg b/examples/demo.jpg deleted file mode 100644 index 9f79c7937346e5bd1e902bc63bb4705ca26629b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74821 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 E*~w{F$p8QV