blob: da527b9b1f5e1771c3714d010bd4dd4ad33d4db0 (
plain)
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
|
#include <limits>
#include "camera.cuh"
__device__ void Camera::render(Scene scene, uint8_t *image) {
const uint3 unnormalized_uv = ((blockDim * blockIdx) + threadIdx);
const unsigned int img_index = (unnormalized_uv.x + (unnormalized_uv.y * blockDim.x * gridDim.x)) * 4;
const vect3 uv = ((2 * make_vect3(unnormalized_uv)) / make_vect3(gridDim * blockDim)) - 1;
Ray ray;
ray.direction = normalize(make_vect3(uv.x, uv.y, 1));
Render_object **objects = scene.get_objects();
Render_object *closest_obj;
T total_dist = 0;
Color pcolor;
for(int steps = 0; steps < max_steps; steps++) {
T min_dist = T_MAX;
T dist;
ray.start = this->pos_ + (total_dist * ray.direction);
for(size_t obj_i = 0; objects[obj_i] != nullptr; obj_i++) {
dist = objects[obj_i]->distance_estimator(ray.start);
if(dist < min_dist) {
min_dist = dist;
if(dist < clip_min) {
steps = max_steps;
pcolor = objects[obj_i]->get_color(ray);
image[img_index+3] = 0xff;
break;
}
if(dist > clip_max) {
steps = max_steps;
image[img_index+3] = 0x00;
break;
}
}
}
total_dist += min_dist;
}
//TODO gamma space
image[img_index] = pcolor.x * 255;
image[img_index+1] = pcolor.y * 255;
image[img_index+2] = pcolor.z * 255;
}
|