-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRayTracing1.0.cpp
More file actions
69 lines (50 loc) · 2.07 KB
/
RayTracing1.0.cpp
File metadata and controls
69 lines (50 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "utility.h"
#include "hittable_list.h"
#include "sphere.h"
#include "color.h"
#include "camera.h"
#include <iostream>
//returns the color of each ray once it reaches the camera
color ray_color(const ray& r, const hittable& world, int depth) {
hit_record rec;
//if ray bounce limit is exceeded, no more light is gathered
if (depth <= 0) {
return color(0, 0, 0);
}
if (world.hit(r, 0.001, infinity, rec)) {
point3 target = rec.p + rec.normal + random_unit_vector();
return 0.5 * ray_color(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);
return (1.0 - t) * color(1.0, 1.0, 1.0) + t * color(0.5, 0.7, 1.0);
}
int main()
{
const auto aspect_ratio = 16.0 / 9.0;
const int image_width = 800;
const int image_height = static_cast<int>(image_width / aspect_ratio);
const int samples_per_pixel = 100;
const int max_depth = 50;
std::cout << "P3\n" << image_width << ' ' << image_height << "\n255\n";
hittable_list world;
world.add(make_shared<sphere>(point3(0, 0, -1), 0.5));
world.add(make_shared<sphere>(point3(0, -100.5, -1), 100));
camera cam;
//iterates through each ray and writes the image into ppm format
for (int j = image_height - 1; j >= 0; j--) {
std::cerr << "\rScanlines remaining: " << j << ' ' << std::flush;
for (int i = 0; i < image_width; i++) {
color pixel_color(0, 0, 0);
for (int s = 0; s < samples_per_pixel; s++) {
auto u = (i + random_double()) / (image_width );
auto v = (j + random_double()) / (image_height);
ray r = cam.get_ray(u, v);
pixel_color += ray_color(r, world, max_depth);
}
//std::cerr << pixel_color << "\n" << std::flush;
write_color(std::cout, pixel_color, samples_per_pixel);
}
}
std::cerr << "\nDone.\n";
}