From 3385ff54c492f9bf21e0fd7368ed999f17281501 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 10 Sep 2019 23:17:29 +0100 Subject: [PATCH] OpenImadeDenoiser --- CMakeLists.txt | 9 +++--- src/denoise/denoise.cpp | 3 ++ src/denoise/denoise.hpp | 24 ++++++++++++++++ src/denoise/oidn.cpp | 5 ++++ src/denoise/oidn.hpp | 5 ++++ src/engine/progressiverenderer.cpp | 28 +++++++++++++------ src/engine/progressiverenderer.hpp | 2 ++ src/engine/renderengine.cpp | 1 - test/main.cpp | 45 ++++++++++++++++++++++-------- 9 files changed, 98 insertions(+), 24 deletions(-) create mode 100644 src/denoise/denoise.cpp create mode 100644 src/denoise/denoise.hpp create mode 100644 src/denoise/oidn.cpp create mode 100644 src/denoise/oidn.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6715f3f..406d134 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,13 +22,10 @@ if (UNIX) endif(UNIX) if (WIN32) - set(CMAKE_CXX_FLAGS "-IC:/dev/SDL2/include/ -LC:/dev/SDL2/lib/x64/") - #set(CMAKE_CXX_FLAGS "-IC:/dev/SDL2_image/include/ -LC:/dev/SDL2_image/lib/x64/") - set(CMAKE_CXX_FLAGS "-IC:/dev/glm") - include_directories(${executable} "C:/dev/glm" "C:/dev/SDL2/include/" + "C:/dev/oidn/include" #"C:/dev/SDL2_image/include/" ) endif (WIN32) @@ -65,6 +62,7 @@ file(GLOB SourceFiles ${SrcDIR}/definitions/* ${SrcDIR}/definitions/materials/* ${SrcDIR}/definitions/primatives/* + ${SrcDIR}/denoise/* ${SrcDIR}/util/* ${SrcDIR}/util/imgui/* ${TestDIR}/${CurrentTest} @@ -93,6 +91,9 @@ if (WIN32) "C:/dev/SDL2/lib/x64/SDL2main.lib" "C:/dev/SDL2/lib/x64/SDL2test.lib" #"C:/dev/SDL2_image/lib/x64/SDL2_image.lib" + "C:/dev/oidn/lib/OpenImageDenoise.lib" + "C:/dev/oidn/lib/tbb.lib" + "C:/dev/oidn/lib/tbbmalloc.lib" ${WinSDK} ) endif (WIN32) diff --git a/src/denoise/denoise.cpp b/src/denoise/denoise.cpp new file mode 100644 index 0000000..4cafe8b --- /dev/null +++ b/src/denoise/denoise.cpp @@ -0,0 +1,3 @@ +#include "denoise.hpp" + + diff --git a/src/denoise/denoise.hpp b/src/denoise/denoise.hpp new file mode 100644 index 0000000..f7ab4f5 --- /dev/null +++ b/src/denoise/denoise.hpp @@ -0,0 +1,24 @@ +#ifndef INFERNO_DENOISE_DENOISE_H_ +#define INFERNO_DENOISE_DENOISE_H_ + +#include "../maths.hpp" + +class Denoiser { +public: + + void SetAlbedo(glm::vec3* albedoBuffer); + void SetNormals(glm::vec3* normalBuffer); + + void Denoise(glm::vec3* target, bool hdr); + +private: + + bool m_hdr; + + glm::vec3* m_albedoBuffer; + glm::vec3* m_normalBuffer; + glm::vec3* m_targetBuffer; + +}; + +#endif diff --git a/src/denoise/oidn.cpp b/src/denoise/oidn.cpp new file mode 100644 index 0000000..0ce6516 --- /dev/null +++ b/src/denoise/oidn.cpp @@ -0,0 +1,5 @@ +#include "oidn.hpp" + +#include + + diff --git a/src/denoise/oidn.hpp b/src/denoise/oidn.hpp new file mode 100644 index 0000000..72d629d --- /dev/null +++ b/src/denoise/oidn.hpp @@ -0,0 +1,5 @@ +#ifndef INFERNO_DENOISE_OIDN_H_ +#define INFERNO_DENOISE_OIDN_H_ + + +#endif diff --git a/src/engine/progressiverenderer.cpp b/src/engine/progressiverenderer.cpp index 85992bf..d971dc3 100644 --- a/src/engine/progressiverenderer.cpp +++ b/src/engine/progressiverenderer.cpp @@ -9,7 +9,6 @@ #include "../common.hpp" #include "../pixel.hpp" - #include "../display/displayinterface.hpp" #include "../display/framebuffer.hpp" @@ -41,13 +40,19 @@ void ProgressiveRenderer::Input() { const Uint8* state = SDL_GetKeyboardState(NULL); - // if (state[SDL_SCANCODE_W]) m_scene->objects[0]->center.y += 0.001f; - // if (state[SDL_SCANCODE_S]) m_scene->objects[0]->center.y -= 0.001f; - // if (state[SDL_SCANCODE_D]) m_scene->objects[0]->center.x += 0.001f; - // if (state[SDL_SCANCODE_A]) m_scene->objects[0]->center.x -= 0.001f; - // if (state[SDL_SCANCODE_R]) m_scene->objects[0]->center.z += 0.001f; - // if (state[SDL_SCANCODE_F]) m_scene->objects[0]->center.z -= 0.001f; - // std::cout << m_scene->objects[0]->center.x << " " << m_scene->objects[0]->center.y << " " << m_scene->objects[0]->center.z << std::endl; + //glm::vec3 pos = m_scene->objects[0]->center; + //if (state[SDL_SCANCODE_W]) m_scene->objects[0]->center.y += 0.01f; + //if (state[SDL_SCANCODE_S]) m_scene->objects[0]->center.y -= 0.01f; + //if (state[SDL_SCANCODE_D]) m_scene->objects[0]->center.x += 0.01f; + //if (state[SDL_SCANCODE_A]) m_scene->objects[0]->center.x -= 0.01f; + //if (state[SDL_SCANCODE_R]) m_scene->objects[0]->center.z += 0.01f; + //if (state[SDL_SCANCODE_F]) m_scene->objects[0]->center.z -= 0.01f; + //glm::vec3 newpos = m_scene->objects[0]->center; + + //if (newpos.x != pos.x || newpos.y != pos.y || newpos.z != pos.z) { + // m_threadPool->ThreadFrameBuffer->ClearFramebuffer(); + // m_engine->SPP = 0; m_engine->SPPDepth = 0; + //} if (!m_interface->ImGui) return; @@ -85,6 +90,11 @@ void ProgressiveRenderer::Input() { ImGui::SliderFloat("Gamma", &m_gamma, 1.0f, 4.0f); m_interface->Framebuffer->Gamma = 1.0f / m_gamma; + if (ImGui::Button("Reset")) { + m_threadPool->ThreadFrameBuffer->ClearFramebuffer(); + m_engine->SPP = 0; m_engine->SPPDepth = 0; + } + if (ImGui::Button("Save Image")) { m_interface->Framebuffer->DumpToFile(m_imageSavePath); std::cout << "Saved: " << m_imageSavePath << std::endl; @@ -107,6 +117,8 @@ void ProgressiveRenderer::Render() { m_engine->Mode = m_mode; m_engine->PostProcess(m_threadPool->ThreadFrameBuffer->RenderTarget, m_threadPool->ThreadFrameBuffer->RenderPostProcess, m_scene->w, m_scene->h); + // Denoise + m_threadPool->ThreadFrameBuffer->PostProcess((ToneMapMode)m_toneMapModeSelected); m_threadPool->MergeBuffers(m_interface->Framebuffer); diff --git a/src/engine/progressiverenderer.hpp b/src/engine/progressiverenderer.hpp index 22ffc86..e20f7a2 100644 --- a/src/engine/progressiverenderer.hpp +++ b/src/engine/progressiverenderer.hpp @@ -11,6 +11,7 @@ class RenderThreadPool; class DisplayInterface; class RenderEngine; +class Denoiser; class Scene; class Ray; @@ -34,6 +35,7 @@ public: RenderThreadPool* m_threadPool = nullptr; DisplayInterface* m_interface = nullptr; RenderEngine* m_engine = nullptr; + Denoiser* m_denoiser = nullptr; Scene* m_scene = nullptr; private: diff --git a/src/engine/renderengine.cpp b/src/engine/renderengine.cpp index 71b2e9a..148adb8 100644 --- a/src/engine/renderengine.cpp +++ b/src/engine/renderengine.cpp @@ -94,7 +94,6 @@ glm::vec3 RenderEngine::GetColour(Ray ray, int& depth) { // colour.r = pattern; colour.g = pattern; colour.b = pattern; //} - if (hit->material->Emissive) return (colour * hit->material->Emittance); glm::vec3 direction = hit->material->Bounce(ray.direction, normal); diff --git a/test/main.cpp b/test/main.cpp index 256cae8..509a712 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -2,8 +2,8 @@ #include "../src/inferno.hpp" -static const int width = 500; -static const int height = 500; +static const int width = 1010; +static const int height = 1010; int main(int argc, char** argv) { InfernoEngine inferno; @@ -18,19 +18,42 @@ int main(int argc, char** argv) { Scene* scene = new Scene(width, height); scene->camera = new Camera(width, height); + + Sphere sphere({ 0.0f, 0.0f, -20.0f }, 1.0f, new Material({ 0.817f, 0.374, 0.574 }, 0.5f)); + scene->objects.push_back(&sphere); - scene->objects.push_back(new Sphere({ 35.0f, 26.0f, 25.0f }, 15.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f, 5.0f))); - scene->objects.push_back(new Sphere({-0.457001f, 0.19f, -3.53899f}, 0.02f, new Material({ 1.0f, 0.9f, 0.8f }, 0.0f, 500.0f))); - scene->objects.push_back(new Plane( { 0.0f, -1.0f, 0.0f }, { 0.0f, -1.0f, 0.0f }, new Material({ 0.847f, 0.792f, 0.658f }, 0.2f))); + Sphere sphere1({ 0.0f, 0.0f, -20.0f }, 1.0f, new Material({ 0.817f, 0.374, 0.574 }, 0.5f)); + scene->objects.push_back(&sphere1); + + Sphere sphere2({ -3.0f, 1.0f, -10.0f }, 1.0f, new Material({ 0.817f, 0.374, 0.574 }, 0.5f)); + scene->objects.push_back(&sphere2); + + Sphere sphere3({ 6.0f, 3.0f, -13.0f }, 1.0f, new Material({ 0.817f, 0.374, 0.574 }, 0.5f)); + scene->objects.push_back(&sphere3); + + Sphere sphere4({ -1.0f, 2.0f, -10.0f }, 1.0f, new Material({ 0.817f, 0.374, 0.574 }, 0.5f)); + scene->objects.push_back(&sphere4); + + Sphere sphere5({ 2.0f, 5.0f, -15.0f }, 1.0f, new Material({ 0.817f, 0.374, 0.574 }, 0.5f)); + scene->objects.push_back(&sphere5); + + Sphere light({ 35.0f, 56.0f, 25.0f }, 35.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f, 5.0f)); + scene->objects.push_back(&light); + + Plane plane({ 0.0f,-1.0f, 0.0f }, { 0.0f, -1.0f, 0.0f }, new Material({ 0.9f, 0.9f, 0.9f }, 0.0f)); + scene->objects.push_back(&plane); + + //scene->objects.push_back(new Sphere({ 35.0f, 26.0f, 25.0f }, 15.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f, 5.0f))); + //scene->objects.push_back(new Sphere({-0.457001f, 0.19f, -3.53899f}, 0.02f, new Material({ 1.0f, 0.9f, 0.8f }, 0.0f, 500.0f))); + //scene->objects.push_back(new Plane( { 0.0f, -1.0f, 0.0f }, { 0.0f, -1.0f, 0.0f }, new Material({ 0.847f, 0.792f, 0.658f }, 0.2f))); // std::vector tris = LoadTrianglesBasic("E://Projects//Inferno//resources//dragon-normals.obj", "E://Projects//Inferno//resources"); - std::vector tris = LoadTrianglesBasic("//home//ben//programming//inferno//resources//dragon-normals.obj", "//home//ben//programming//inferno//resources//resources"); - - Mesh* mesh1 = new Mesh(tris); - mesh1->Translate({ 0.2f, -1.04, -3.8f }); - mesh1->Optimise(); - scene->meshs.push_back(mesh1); + //std::vector tris = LoadTrianglesBasic("//home//ben//programming//inferno//resources//dragon-normals.obj", "//home//ben//programming//inferno//resources//resources"); + //Mesh* mesh1 = new Mesh(tris); + //mesh1->Translate({ 0.2f, -1.04, -3.8f }); + //mesh1->Optimise(); + //scene->meshs.push_back(mesh1); inferno.SetScene(scene);