diff options
author | brett weiland <brettsweiland@gmail.com> | 2024-06-01 16:58:25 -0500 |
---|---|---|
committer | brett weiland <brettsweiland@gmail.com> | 2024-06-01 16:58:25 -0500 |
commit | c05aa71f402abb3b0f05a40fa61e6159cf87ebd6 (patch) | |
tree | 12bcabc50251f5df0687440639339df3036c1db7 | |
parent | b0dd97ee6bf8d5daa587da40ad941efac68152df (diff) |
-rw-r--r-- | src/README.md | 1 | ||||
-rw-r--r-- | src/camera.cu | 44 | ||||
-rw-r--r-- | src/camera.cuh | 20 | ||||
-rw-r--r-- | src/common.cuh | 2 | ||||
-rw-r--r-- | src/kernel.cu | 4 | ||||
-rw-r--r-- | src/makefile | 4 | ||||
-rw-r--r-- | src/scene.cu | 1 | ||||
-rw-r--r-- | src/scene.cuh | 12 | ||||
-rw-r--r-- | src/sphere.cu | 4 |
9 files changed, 70 insertions, 22 deletions
diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..871c4ff --- /dev/null +++ b/src/README.md @@ -0,0 +1 @@ +I overcomplicated this. This project is now dead diff --git a/src/camera.cu b/src/camera.cu new file mode 100644 index 0000000..da527b9 --- /dev/null +++ b/src/camera.cu @@ -0,0 +1,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; +} diff --git a/src/camera.cuh b/src/camera.cuh index 4d04fcd..7d04d98 100644 --- a/src/camera.cuh +++ b/src/camera.cuh @@ -1,25 +1,26 @@ #ifndef CAMERA_H #define CAMERA_H - +#include <stdint.h> +#include <limits> #include "entity.cuh" #include "common.cuh" -#include <limits> +#include "scene.cuh" //template <class T> class scene; //I am soooo high lol -class camera : public entity { +class Camera : public Entity { public: - __device__ camera(scene *pscene, const T fov = 1, const vect3 pos = make_vect3(0), const vect3 rot = make_vect3(0)) - : pscene(pscene), fov(fov), entity(pos, rot, make_vect3(0)) {}; + __device__ Camera(const T fov = 1, const vect3 pos = make_vect3(0), const vect3 rot = make_vect3(0)) + : fov(fov), Entity(pos, rot, make_vect3(0)) {}; + __device__ void render(Scene scene, uint8_t *image); private: + const T clip_min = .1; + const T clip_max = 100; + const int max_steps = 100; T fov; float2 size; - int steps = 100; - T clip_min = .1; - T clip_max = 100; - //scene *pscene; }; /** @@ -71,5 +72,4 @@ template <class T> __device__ void camera::render() { } **/ - #endif diff --git a/src/common.cuh b/src/common.cuh index 9e026f4..2897213 100644 --- a/src/common.cuh +++ b/src/common.cuh @@ -2,6 +2,7 @@ #define COMMON_H #include "include/helper_math.h" +#include <float.h> /** @@ -35,6 +36,7 @@ ways, so I'm switching over to typedefs. **/ typedef float2 vect2; typedef float3 vect3; typedef float T; +#define T_MAX FLT_MAX #define make_vect3(...) (make_float3(__VA_ARGS__)) diff --git a/src/kernel.cu b/src/kernel.cu index 40944c0..fd0ae68 100644 --- a/src/kernel.cu +++ b/src/kernel.cu @@ -2,9 +2,11 @@ #include <stdint.h> #include <stdio.h> #include "scene.cuh" +#include "camera.cuh" __global__ void render(uint8_t *image) { Scene scene; - scene.debug(); + Camera cam(1, make_vect3(0,0,0)); + cam.render(scene, image); //scene.render(image); } diff --git a/src/makefile b/src/makefile index 4d86411..eb8e91b 100644 --- a/src/makefile +++ b/src/makefile @@ -7,10 +7,10 @@ CU_SRCFILES := $(wildcard *.cu) CU_OBJFILES := $(patsubst %.cu, %.o, $(CU_SRCFILES)) all: $(CU_OBJFILES) - nvcc $(LIBS) -o build/indigo_worlds build/*.o + nvcc $(LIBS) -g -G -o build/indigo_worlds build/*.o %.o: %.cu - nvcc --device-debug -dc -c $< -o build/$@ + nvcc -g -G -dc -c $< -o build/$@ run: all build/indigo_worlds diff --git a/src/scene.cu b/src/scene.cu index 100af14..2214019 100644 --- a/src/scene.cu +++ b/src/scene.cu @@ -12,3 +12,4 @@ __device__ Color Scene::raycast(struct Ray ray) { for(size_t obj_i = 0; obj_i < obj_count; obj_i++); return make_color(0); } + diff --git a/src/scene.cuh b/src/scene.cuh index e3d5896..a8802ad 100644 --- a/src/scene.cuh +++ b/src/scene.cuh @@ -2,8 +2,8 @@ #define SCENE_H #include "common.cuh" -#include "sphere.cuh" #include "render_object.cuh" +#include "sphere.cuh" #include "include/helper_math.h" #include <stdint.h> @@ -14,17 +14,15 @@ class Scene { const int max_bounces = 10; public: - //__device__ void render(uint8_t *image) { cam.render(); }; - __device__ Render_object **get_objs() { return objs; } __device__ void debug(); __device__ Color raycast(struct Ray ray); + __device__ Render_object **get_objects() { return objs; } private: - //camera cam = camera(); - Sphere sp1 = Sphere(make_vect3(0, .4, -5)); - Sphere sp2 = Sphere(make_vect3(0, -0.4,-5)); + Sphere sp1 = Sphere(make_vect3(0, -2, 5)); + Sphere sp2 = Sphere(make_vect3(2, 0, 5)); protected: //idk why I need to specify the size... why can't the compiler figure that out? - Render_object *objs[3] = {&sp1, &sp2, NULL}; + Render_object *objs[3] = {&sp1, &sp2, nullptr}; uint8_t *image; }; diff --git a/src/sphere.cu b/src/sphere.cu index 849a37d..d1ae9e9 100644 --- a/src/sphere.cu +++ b/src/sphere.cu @@ -1,9 +1,9 @@ #include "sphere.cuh" __device__ T Sphere::distance_estimator(vect3 point) const { - return length(point) - r_; + return length(this->pos_ - point) - r_; } __device__ Color Sphere::get_color(struct Ray ray) const { - return make_color(0); + return normalize(ray.start); } |