moving files
This commit is contained in:
Vendored
-20
@@ -1,20 +0,0 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "(lldb) Launch",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/bin/RayTracer",
|
||||
"args": [],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}/bin/",
|
||||
"environment": [],
|
||||
"externalConsole": false,
|
||||
"MIMode": "lldb"
|
||||
}
|
||||
]
|
||||
}
|
||||
Vendored
-4
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"cmake.buildDirectory": "${workspaceFolder}/bin/",
|
||||
"cmake.generator": ""
|
||||
}
|
||||
+3
-4
@@ -11,6 +11,7 @@ set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/external/vcpkg/scripts/buil
|
||||
|
||||
project(RayTracer)
|
||||
|
||||
find_package(Vulkan REQUIRED)
|
||||
find_package(glew CONFIG REQUIRED)
|
||||
find_package(assimp CONFIG REQUIRED)
|
||||
find_package(glfw3 CONFIG REQUIRED)
|
||||
@@ -20,14 +21,12 @@ find_package(imgui CONFIG REQUIRED)
|
||||
|
||||
add_executable(RayTracer "")
|
||||
target_include_directories(RayTracer PUBLIC src/)
|
||||
target_link_libraries(RayTracer PUBLIC Vulkan::Vulkan)
|
||||
target_link_libraries(RayTracer PUBLIC Vulkan::Headers)
|
||||
target_link_libraries(RayTracer PUBLIC assimp::assimp)
|
||||
target_link_libraries(RayTracer PUBLIC glfw)
|
||||
target_link_libraries(RayTracer PUBLIC imgui::imgui)
|
||||
if(APPLE)
|
||||
target_link_libraries(RayTracer PUBLIC GLEW::GLEW)
|
||||
else()
|
||||
target_link_libraries(RayTracer PUBLIC GLEW::glew)
|
||||
endif()
|
||||
target_link_libraries(RayTracer PUBLIC glm::glm)
|
||||
target_link_libraries(RayTracer PUBLIC KTX::ktx)
|
||||
|
||||
|
||||
Vendored
+1
-1
Submodule external/vcpkg updated: 01be99fec0...791ae5e74b
+3
-1
@@ -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/)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
target_sources(RayTracer
|
||||
PRIVATE
|
||||
Renderer.h
|
||||
Renderer.cpp)
|
||||
@@ -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) {}
|
||||
@@ -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
@@ -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),
|
||||
|
||||
+12
-15
@@ -1,22 +1,19 @@
|
||||
#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::render(Camera cam, RenderParameter params)
|
||||
void Scene::startRender(Camera cam, RenderParameter params)
|
||||
{
|
||||
if (!firstTime)
|
||||
{
|
||||
@@ -29,9 +26,11 @@ void Scene::render(Camera cam, RenderParameter params)
|
||||
accumulator.clear();
|
||||
image.resize(params.width * params.height);
|
||||
accumulator.resize(params.width * params.height);
|
||||
worker = std::thread(
|
||||
[&, cam, params]()
|
||||
{
|
||||
worker = std::thread(&Scene::render, this, cam, params);
|
||||
}
|
||||
|
||||
void Scene::render(Camera cam, RenderParameter params)
|
||||
{
|
||||
for (int samp = 0; samp < params.numSamples; ++samp)
|
||||
{
|
||||
if (pendingCancel)
|
||||
@@ -44,10 +43,9 @@ void Scene::render(Camera cam, RenderParameter params)
|
||||
{
|
||||
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))
|
||||
};
|
||||
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] +=
|
||||
@@ -61,5 +59,4 @@ void Scene::render(Camera cam, RenderParameter params)
|
||||
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
@@ -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;
|
||||
|
||||
+1
-1
@@ -4,12 +4,12 @@
|
||||
"name": "imgui",
|
||||
"features": [ "glfw-binding", "opengl3-binding" ]
|
||||
},
|
||||
"vulkan",
|
||||
"assimp",
|
||||
"ktx",
|
||||
"glfw3",
|
||||
"glew",
|
||||
"glm",
|
||||
"stb",
|
||||
"fmt"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user