From 92329f633db517252c86e54219484ec4c964815b Mon Sep 17 00:00:00 2001 From: K Tyl Date: Sat, 6 Jun 2020 23:01:46 +0100 Subject: [PATCH] diffuse materials --- src/colour.h | 8 ++++---- src/main.cpp | 17 ++++++++++++----- src/vec3.h | 22 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/colour.h b/src/colour.h index 95d02d5..1347b08 100755 --- a/src/colour.h +++ b/src/colour.h @@ -10,11 +10,11 @@ void write_colour(std::ostream &out, colour pixel_colour, int samples_per_pixel) auto g = pixel_colour.y(); auto b = pixel_colour.z(); - // divide the colour total by the number of samples + // divide the colour total by the number of samples and gamme-correct for gamma=2.0 auto scale = 1.0 / samples_per_pixel; - r *= scale; - g *= scale; - b *= scale; + r = sqrt(scale * r); + g = sqrt(scale * g); + b = sqrt(scale * b); // write the translated [0,255] value of each colour component. out << static_cast(256 * clamp(r, 0.0, 0.999)) << ' ' diff --git a/src/main.cpp b/src/main.cpp index e34542a..f07d189 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,20 +11,27 @@ const double ASPECT_RATIO = 16.0 / 9.0; const int WIDTH = 384; const int HEIGHT = static_cast(WIDTH / ASPECT_RATIO); const int SAMPLES_PER_PIXEL = 100; +const int MAX_DEPTH = 50; -colour ray_colour(const ray& r, const hittable& world) +colour ray_colour(const ray& r, const hittable& world, int depth) { hit_record rec; + if (depth <= 0) + { + return colour(0,0,0); + } + if (world.hit(r, 0, infinity, rec)) { - return 0.5 * (rec.normal + colour(1,1,1)); + point3 target = rec.p + rec.normal + random_in_unit_sphere(); + return 0.5 * ray_colour(ray(rec.p, target - rec.p), world, depth-1); } vec3 unit_direction = unit_vector(r.direction()); auto t = 0.5 * (unit_direction.y() + 1.0); - auto a = colour(1.0, 0.5, 0.6); - auto b = colour(0.0, 0.0, 0.0); + auto a = colour(0.5, 0.6, 0.7); + auto b = colour(1.0, 1.0, 1.0); return lerp(a, b, t); } @@ -60,7 +67,7 @@ int main() auto u = (i + random_double()) / (WIDTH-1); auto v = (j + random_double()) / (HEIGHT-1); ray r = cam.get_ray(u, v); - pixel_colour += ray_colour(r, world); + pixel_colour += ray_colour(r, world, MAX_DEPTH); } write_colour(std::cout, pixel_colour, SAMPLES_PER_PIXEL); diff --git a/src/vec3.h b/src/vec3.h index c0084a7..f562294 100755 --- a/src/vec3.h +++ b/src/vec3.h @@ -3,9 +3,21 @@ #include #include +#include "rtweekend.h" + class vec3 { public: + inline static vec3 random() + { + return vec3(random_double(),random_double(),random_double()); + } + + inline static vec3 random(double min, double max) + { + return vec3(random_double(min,max),random_double(min,max),random_double(min,max)); + } + vec3() : e{0,0,0} {} vec3(double e0, double e1, double e2) : e{e0, e1, e2} {} @@ -116,3 +128,13 @@ inline vec3 unit_vector(vec3 v) { return v / v.length(); } + +vec3 random_in_unit_sphere() +{ + while (true) + { + auto p = vec3::random(-1,1); + if (p.length_squared() >= 1) continue; + return p; + } +}