diff --git a/screenshots/pinkspheres.png b/screenshots/pinkspheres.png new file mode 100644 index 0000000..2484bf3 Binary files /dev/null and b/screenshots/pinkspheres.png differ diff --git a/src/main.cpp b/src/main.cpp index ece418c..c70d421 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,18 +8,21 @@ #include -const double ASPECT_RATIO = 32.0 / 9.0; -const int WIDTH = 800; +const double ASPECT_RATIO = 16.0 / 9.0; +const int WIDTH = 1920; const int HEIGHT = static_cast(WIDTH / ASPECT_RATIO); const int SAMPLES_PER_PIXEL = 32; -const int MAX_DEPTH = 16; +const int MAX_DEPTH = 5; + +const colour pink(0.973, 0.784, 0.863); +const colour grey(0.133, 0.133, 0.133); colour ray_colour(const ray& r, const hittable& world, int depth) { hit_record rec; if (depth <= 0) { - return colour(0,0,0); + return grey; } if (world.hit(r, 0.001, infinity, rec)) @@ -32,69 +35,77 @@ colour ray_colour(const ray& r, const hittable& world, int depth) return attenuation * ray_colour(scattered, world, depth-1); } - return colour(0,0,0); + return grey; } vec3 unit_direction = unit_vector(r.direction()); - auto t = 0.5 * (unit_direction.y() + 1.0); + auto t = 0.5 * (unit_direction.y() + 1.0) + 0.5; - auto a = colour(0.8, 0.7, 1.0); - auto b = colour(1.0, 1.0, 1.0); - - return lerp(a, b, t); + return lerp(grey, pink, t); } hittable_list random_scene() { hittable_list world; - auto ground_material = make_shared(colour(0.5, 0.5, 0.5)); - world.add(make_shared(point3(0,-1000,0), 1000, ground_material)); - for (int a = -11; a < 11; a++) - { - for (int b = -11; b < 11; b++) - { - auto choose_mat = random_double(); - point3 centre(a + 0.9*random_double(), 0.2, b + 0.9*random_double()); + //auto ground_material = make_shared(pink); + //world.add(make_shared(point3(0,-1000,0), 1000, ground_material)); - if ((centre - point3(4, 0.2, 0)).length() > 0.9) - { - shared_ptr sphere_material; + //for (int a = -11; a < 11; a++) + //{ + // for (int b = -11; b < 11; b++) + // { + // auto choose_mat = random_double(); + // point3 centre(a + 0.9*random_double(), 0.2, b + 0.9*random_double()); - if (choose_mat < 0.8) - { - // diffuse - auto albedo = colour::random() * colour::random(); - sphere_material = make_shared(albedo); - world.add(make_shared(centre, 0.2, sphere_material)); - } - else if (choose_mat < 0.95) - { - // metal - auto albedo = colour::random(0.5, 1); - auto fuzz = random_double(0, 0.5); - sphere_material = make_shared(albedo, fuzz); - world.add(make_shared(centre, 0.2, sphere_material)); - } - else - { - // glass - sphere_material = make_shared(1.5); - world.add(make_shared(centre,0.2, sphere_material)); - } - } - } - } + // if ((centre - point3(4, 0.2, 0)).length() > 0.9) + // { + // shared_ptr sphere_material; + + // if (choose_mat < 0.8) + // { + // // diffuse + // //auto albedo = colour::random() * colour::random(); + // sphere_material = make_shared(pink); + // world.add(make_shared(centre, 0.2, sphere_material)); + // } + // else if (choose_mat < 0.95) + // { + // // metal + // auto fuzz = random_double(0, 0.5); + // sphere_material = make_shared(pink, fuzz); + // world.add(make_shared(centre, 0.2, sphere_material)); + // } + // else + // { + // // glass + // sphere_material = make_shared(1.5); + // world.add(make_shared(centre,0.2, sphere_material)); + // } + // } + // } + //} auto material1 = make_shared(1.5); - world.add(make_shared(point3(0, 1, 0), 1.0, material1)); + world.add(make_shared(point3(0, 0, 0), 3.0, material1)); - auto material2 = make_shared(colour(0.4, 0.2, 0.1)); - world.add(make_shared(point3(-4, 1, 0), 1.0, material2)); + //auto material2 = make_shared(pink); + //world.add(make_shared(point3(-4, 1, 0), 1.0, material2)); - auto material3 = make_shared(colour(0.7, 0.6, 0.5), 0.0); - world.add(make_shared(point3(4, 1, 0), 1.0, material3)); + auto material3 = make_shared(pink, 0.5); + int sphere_count = 3; + for (int i = 0; i < sphere_count; i++) + { + float a = 6.28 * (float)i/sphere_count - 100.0; + float r = 8.0; + float x = r*sin(a); + float y = 2.0*cos(a); + float z = r*cos(a); + point3 pos(x,y,z); + world.add(make_shared(pos, 4.0, material3)); + } + return world; } @@ -105,13 +116,15 @@ int main() hittable_list world = random_scene(); - point3 lookfrom(13,2,3); + auto dist_to_target = 10.0; + auto dist_to_focus = dist_to_target + 1.0; + auto cam_y = 1.0; + point3 lookfrom(0,cam_y,-dist_to_target); point3 lookat(0,0,0); vec3 vup(0,1,0); - auto dist_to_focus = 10.0; - auto aperture = 0.1; + auto aperture = 0.5; - camera cam(lookfrom, lookat, vup, 20, ASPECT_RATIO, aperture, dist_to_focus); + camera cam(lookfrom, lookat, vup, 47, ASPECT_RATIO, aperture, dist_to_focus); for (int j = HEIGHT - 1; j >= 0; --j) {