#include #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; }