-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRender.cpp
More file actions
59 lines (40 loc) · 1.94 KB
/
Copy pathRender.cpp
File metadata and controls
59 lines (40 loc) · 1.94 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
#include "Render.h"
void render(std::ostream &os, const ImageDimensions &dim, const Viewport& viewport, const Camera& camera, const ListOfHittables& world, int samples_per_pixel = 100) {
/// Write PPM image file to ostream
assert(samples_per_pixel > 0);
Countdown scanLinesRemaining {dim.height};
// Render header
os << std::format("P3\n{} {}\n255\n", dim.width, dim.height);
const double weight = 1.0 / samples_per_pixel;
for (gsl::index j = 0; j < dim.height; ++j) {
scanLinesRemaining.log();
for (gsl::index i = 0; i < dim.width; ++i) {
const Colour pixel_colour = [&](){
Colour col {0,0,0};
for (gsl::index s = 0; s < samples_per_pixel; ++s) {
Ray ray = generate_random_ray_from_position(i,j, viewport, camera);
col += ray_colour(ray, world, 10) * weight;
}
return col;
}();
write_color(os, pixel_colour);
}
--scanLinesRemaining;
}
}
Ray generate_random_ray_from_position(gsl::index i, gsl::index j, const Viewport &viewport, const Camera &camera) {
/// Get a randomly sampled camera ray for the pixel at location i,j.
auto pixel_sample_square = [&]() -> Vec3 {
// Returns a random point in the square surrounding a pixel at the origin.
auto px = -0.5 + utils::random_double();
auto py = -0.5 + utils::random_double();
return (px * viewport.horizontal_pixel_delta()) + (py * viewport.vertical_pixel_delta());
};
Point3 pixel_center = viewport.pixel00()
+ (gsl::narrow_cast<double>(i) * viewport.horizontal_pixel_delta())
+ (gsl::narrow_cast<double>(j) * viewport.vertical_pixel_delta());
auto pixel_sample = pixel_center + pixel_sample_square();
auto ray_origin = camera.center();
auto ray_direction = pixel_sample - ray_origin;
return Ray(ray_origin, ray_direction);
}