aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/camera.hpp3
-rw-r--r--shaders/compute.comp8
-rw-r--r--src/camera.cpp4
-rw-r--r--src/main.cpp28
4 files changed, 31 insertions, 12 deletions
diff --git a/include/camera.hpp b/include/camera.hpp
index 88ece6f..f1b199a 100644
--- a/include/camera.hpp
+++ b/include/camera.hpp
@@ -19,6 +19,9 @@ class camera {
point3 position;
double lens_radius;
+ float viewport_width;
+ float viewport_height;
+
vec3 horizontal;
vec3 vertical;
diff --git a/shaders/compute.comp b/shaders/compute.comp
index 10123dc..8126536 100644
--- a/shaders/compute.comp
+++ b/shaders/compute.comp
@@ -1,6 +1,9 @@
layout(set = 0, binding = 0) buffer Inputs {
vec3 sky_color;
vec3 ground_color;
+ float viewport_width;
+ float viewport_height;
+ vec2 padding;
vec3 [1920 * 1080] image;
};
@@ -10,5 +13,8 @@ void main() {
uint width = gl_NumWorkGroups.x;
uint height = gl_NumWorkGroups.y;
- image[y * width + x] = vec3(float (x) / width, float (y) / height, 0.0);
+ vec2 uv = vec2(float(x) / width, 1.0 - float(y) / height);
+ vec2 ndc = vec2(uv * 2.0 - 1.0);
+
+ image[y * width + x] = mix(ground_color, sky_color, uv.y);
}
diff --git a/src/camera.cpp b/src/camera.cpp
index c7866d6..592f3d5 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -16,8 +16,8 @@ camera::camera(
up = forward.cross(right).unit();
auto h = tan(deg_to_rad(v_fov) / 2.0);
- auto viewport_height = 2.0 * h;
- auto viewport_width = viewport_height * aspect_ratio;
+ viewport_height = 2.0 * h;
+ viewport_width = viewport_height * aspect_ratio;
horizontal = focus_dist * viewport_width * right;
vertical = focus_dist * viewport_height * up;
diff --git a/src/main.cpp b/src/main.cpp
index c8c1288..53d116c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -344,19 +344,24 @@ void create_descriptor_set() {
vkAllocateDescriptorSets(device, &descriptor_set_allocate_info, &compute_shader_input_set);
}
+struct input_data {
+ color sky_color;
+ color ground_color;
+ float viewport_width;
+ float viewport_height;
+ float pad1;
+ float pad2;
+};
struct path_tracer_data {
- struct input_data {
- color sky_color;
- color ground_color;
- } inputs;
+ struct input_data inputs;
color output_image[1920 * 1080];
};
struct path_tracer_data* mapped_data;
VkBuffer compute_shader_input_buffer;
-void fill_descriptor_set() {
+void fill_descriptor_set(const input_data& inputs) {
VkBufferCreateInfo buffer_info = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
- buffer_info.size = sizeof(color) * 2 + (sizeof(color) * 1920 * 1080);
+ buffer_info.size = sizeof(path_tracer_data);
buffer_info.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
VmaAllocationCreateInfo alloc_create_info = {};
@@ -366,8 +371,7 @@ void fill_descriptor_set() {
vmaCreateBuffer(allocator, &buffer_info, &alloc_create_info, &compute_shader_input_buffer, &allocation, nullptr);
vmaMapMemory(allocator, allocation, (void**) &mapped_data);
- std::memcpy(&mapped_data->inputs.sky_color, &sky_color, sizeof(color));
- std::memcpy(&mapped_data->inputs.ground_color, &ground_color, sizeof(color));
+ std::memcpy(&mapped_data->inputs, &inputs, sizeof(inputs));
VkDescriptorBufferInfo descriptor_buf_info = {};
descriptor_buf_info.buffer = compute_shader_input_buffer;
@@ -446,10 +450,16 @@ int main() {
const double aperture = 0.1;
const double distance_to_focus = 10;
camera camera { camera_position, camera_target, 20.0, aspect_ratio, aperture, distance_to_focus };
+ struct input_data inputs = {
+ .sky_color = sky_color,
+ .ground_color = ground_color,
+ .viewport_width = camera.viewport_width,
+ .viewport_height = camera.viewport_height
+ };
// World hittable objects
hittable_list world = random_scene();
- fill_descriptor_set();
+ fill_descriptor_set(inputs);
// PPM format header
std::cout << "P3\n" << width << '\n' << height << "\n255" << std::endl;