moving files

This commit is contained in:
Dynamitos
2025-01-25 13:04:12 +01:00
parent 9370e4125a
commit a47f921d08
14 changed files with 152 additions and 80 deletions
+3 -1
View File
@@ -3,8 +3,10 @@ target_sources(RayTracer
main.cpp
Minimal.h
ThreadPool.h
ThreadPool.cpp)
ThreadPool.cpp
)
add_subdirectory(gpu/)
add_subdirectory(scene/)
add_subdirectory(window/)
add_subdirectory(util/)
+4
View File
@@ -0,0 +1,4 @@
target_sources(RayTracer
PRIVATE
Renderer.h
Renderer.cpp)
+57
View File
@@ -0,0 +1,57 @@
#include "Renderer.h"
Renderer::Renderer()
: instance(nullptr), physicalDevice(nullptr), device(nullptr), queue(nullptr), cmdPool(nullptr), cmdBuffers(nullptr),
descriptorLayout(nullptr), descriptorSet(nullptr), descriptorPool(nullptr), pipelineLayout(nullptr), rayGen(nullptr),
closestHit(nullptr), miss(nullptr), pipeline(nullptr)
{
vk::ApplicationInfo appInfo("RayTracer", 1, "RayTracer", 1, VK_API_VERSION_1_3);
vk::InstanceCreateInfo instanceCreateInfo({}, &appInfo);
instance = Instance(context, instanceCreateInfo);
auto physicalDevices = PhysicalDevices(instance);
for (auto& dev : physicalDevices)
{
for (auto ext : dev.enumerateDeviceExtensionProperties())
{
if (std::strcmp(ext.extensionName, vk::KHRRayTracingPipelineExtensionName))
{
physicalDevice = dev;
break;
}
}
}
uint32_t computeQueueFamily = 0;
auto queueProps = physicalDevice.getQueueFamilyProperties();
for (uint32_t i = 0; i < queueProps.size(); ++i)
{
if (queueProps[i].queueFlags & vk::QueueFlagBits::eCompute)
{
computeQueueFamily = i;
break;
}
}
float queuePriority = 0.0f;
vk::DeviceQueueCreateInfo deviceQueueCreateInfo({}, computeQueueFamily, 1, &queuePriority);
vk::DeviceCreateInfo deviceCreateInfo({}, deviceQueueCreateInfo);
device = Device(physicalDevice, deviceCreateInfo);
vk::CommandPoolCreateInfo commandPoolCreateInfo({}, computeQueueFamily);
cmdPool = CommandPool(device, commandPoolCreateInfo);
// allocate a CommandBuffer from the CommandPool
vk::CommandBufferAllocateInfo commandBufferAllocateInfo(cmdPool, vk::CommandBufferLevel::ePrimary, 10);
cmdBuffers = vk::raii::CommandBuffers(device, commandBufferAllocateInfo);
vk::DescriptorSetLayoutBinding descriptorSetLayoutBinding(0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex);
vk::DescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo({}, descriptorSetLayoutBinding);
descriptorLayout = DescriptorSetLayout(device, descriptorSetLayoutCreateInfo);
// create a PipelineLayout using that DescriptorSetLayout
vk::PipelineLayoutCreateInfo pipelineLayoutCreateInfo({}, *descriptorLayout);
pipelineLayout = PipelineLayout(device, pipelineLayoutCreateInfo);
}
Renderer::~Renderer() {}
void Renderer::render(Camera cam, RenderParameter param) {}
+36
View File
@@ -0,0 +1,36 @@
#pragma once
#include "scene/Scene.h"
#include <vulkan/vulkan.hpp>
#include <vulkan/vulkan_raii.hpp>
using namespace vk::raii;
struct Renderer : public Scene
{
public:
Renderer();
virtual ~Renderer();
private:
Context context;
Instance instance;
PhysicalDevice physicalDevice;
Device device;
Queue queue;
CommandPool cmdPool;
CommandBuffers cmdBuffers;
DescriptorSetLayout descriptorLayout;
DescriptorSet descriptorSet;
DescriptorPool descriptorPool;
PipelineLayout pipelineLayout;
ShaderModule rayGen;
ShaderModule closestHit;
ShaderModule miss;
Pipeline pipeline;
virtual void render(Camera cam, RenderParameter param);
};
+1 -1
View File
@@ -9,7 +9,7 @@ int main()
{
Scene scene;
Window window(1920, 1080);
scene.render(
scene.startRender(
Camera{
.position = glm::vec3(10, 0, 0),
.direction = glm::vec3(-1, 0, 0),
+43 -46
View File
@@ -1,65 +1,62 @@
#include "Scene.h"
#include "util/ModelLoader.h"
#include <iostream>
#include <chrono>
#include <iostream>
Scene::Scene()
{
bvh.addModels(ModelLoader::loadModel("../cube.fbx"),
glm::mat4(glm::vec4(1.0f, 0.0f, 0.0f, 0.0f),
glm::vec4(0.0f, 1.0f, 0.0f, 0.0f),
glm::vec4(0.0f, 0.0f, 1.0f, 0.0f),
glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)));
bvh.addModels(ModelLoader::loadModel("../res/models/cube.fbx"), glm::mat4(glm::vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::vec4(0.0f, 1.0f, 0.0f, 0.0f),
glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)));
bvh.generate();
}
Scene::~Scene() {}
static bool firstTime = true;
void Scene::startRender(Camera cam, RenderParameter params)
{
if (!firstTime)
{
pendingCancel = true;
worker.join();
firstTime = false;
}
pendingCancel = false;
image.clear();
accumulator.clear();
image.resize(params.width * params.height);
accumulator.resize(params.width * params.height);
worker = std::thread(&Scene::render, this, cam, params);
}
void Scene::render(Camera cam, RenderParameter params)
{
if (!firstTime)
for (int samp = 0; samp < params.numSamples; ++samp)
{
if (pendingCancel)
return;
Batch batch;
for (int w = 0; w < params.width; ++w)
{
pendingCancel = true;
worker.join();
firstTime = false;
}
pendingCancel = false;
image.clear();
accumulator.clear();
image.resize(params.width * params.height);
accumulator.resize(params.width * params.height);
worker = std::thread(
[&, cam, params]()
{
for (int samp = 0; samp < params.numSamples; ++samp)
batch.jobs.push_back(
[&, w]()
{
for (int h = 0; h < params.height; ++h)
{
if (pendingCancel)
return;
Batch batch;
for (int w = 0; w < params.width; ++w)
{
batch.jobs.push_back(
[&, w]()
{
for (int h = 0; h < params.height; ++h)
{
Ray r = Ray{
.origin = glm::vec3(0.0f),
.direction = glm::normalize(glm::vec3((float)std::rand() / RAND_MAX, (float)std::rand() / RAND_MAX, (float)std::rand() / RAND_MAX))
};
bvh.traceRay(r);
Ray r = Ray{.origin = glm::vec3(0.0f),
.direction = glm::normalize(
glm::vec3((float)std::rand() / RAND_MAX, (float)std::rand() / RAND_MAX, (float)std::rand() / RAND_MAX))};
bvh.traceRay(r);
accumulator[w + h * params.width] +=
glm::vec3(w / float(params.width * params.numSamples), h / float(params.height * params.numSamples), 0);
}
});
}
auto start = std::chrono::high_resolution_clock::now();
threadPool.runBatch(std::move(batch));
auto end = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << std::endl;
std::memcpy(image.data(), accumulator.data(), accumulator.size() * sizeof(glm::vec3));
accumulator[w + h * params.width] +=
glm::vec3(w / float(params.width * params.numSamples), h / float(params.height * params.numSamples), 0);
}
});
});
}
auto start = std::chrono::high_resolution_clock::now();
threadPool.runBatch(std::move(batch));
auto end = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << std::endl;
std::memcpy(image.data(), accumulator.data(), accumulator.size() * sizeof(glm::vec3));
}
}
+3 -2
View File
@@ -15,10 +15,11 @@ class Scene
{
public:
Scene();
~Scene();
void render(Camera cam, RenderParameter params);
virtual ~Scene();
void startRender(Camera cam, RenderParameter params);
constexpr const std::vector<glm::vec3>& getImage() const { return image; }
private:
virtual void render(Camera cam, RenderParameter params);
std::atomic_bool pendingCancel = false;
ThreadPool threadPool;
std::thread worker;