From 5a3d4539aff1f9d61d3ba7798de3f824091238d4 Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Tue, 10 Sep 2019 14:49:44 +0100 Subject: [PATCH] STABLE RELEASE - new framebuffer works, gamma slider fixed --- src/display/framebuffer.cpp | 35 ++++++++++++++++++++++-------- src/display/framebuffer.hpp | 12 ++++++---- src/engine/progressiverenderer.cpp | 4 +++- src/engine/renderengine.cpp | 2 +- src/util/threadpool.cpp | 8 +++++-- src/util/threadpool.hpp | 5 ++++- test/main.cpp | 6 ++--- 7 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/display/framebuffer.cpp b/src/display/framebuffer.cpp index a144f0d..47f0ae0 100644 --- a/src/display/framebuffer.cpp +++ b/src/display/framebuffer.cpp @@ -61,15 +61,6 @@ void FrameBuffer::RenderPostProcessSafe(int x, int y, glm::vec3 p) { } } -uint32_t FrameBuffer::FinalProcess(glm::vec3 p) { - Pixel pixel { - (uint8_t)(pow(p.r, Gamma) * 255.0f), - (uint8_t)(pow(p.g, Gamma) * 255.0f), - (uint8_t)(pow(p.b, Gamma) * 255.0f) - }; - return pixel.rgb(); -} - void FrameBuffer::RenderSetPixelSafe(int x, int y, uint32_t p) { if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) { RenderData[y * this->XRes + x] = p; @@ -106,9 +97,35 @@ void FrameBuffer::PostProcess(ToneMapMode mode) { m_swapBuffer[y * this->XRes + x] = Clamp(RenderPostProcess[y * this->XRes + x], 1.0f, 0.0f); } + } else { + for (int x = 0; x < XRes; x++) + for (int y = 0; y < YRes; y++) { + m_swapBuffer[y * this->XRes + x] = Clamp(RenderPostProcess[y * this->XRes + x], 1.0f, 0.0f); + } + } + + for (int x = 0; x < XRes; x++) + for (int y = 0; y < YRes; y++) { + RenderPostProcess[y * this->XRes + x] = m_swapBuffer[y * this->XRes + x]; } } +uint32_t FrameBuffer::FinalProcess(glm::vec3 p) { + Pixel pixel { + (uint8_t)(pow(p.r, Gamma) * 255.0f), + (uint8_t)(pow(p.g, Gamma) * 255.0f), + (uint8_t)(pow(p.b, Gamma) * 255.0f) + }; + return pixel.rgb(); +} + +void FrameBuffer::Ready() { + for (int x = 0; x < XRes; x++) + for (int y = 0; y < YRes; y++) { + uint32_t p = FinalProcess(RenderPostProcess[y * this->XRes + x]); + RenderSetPixelSafe(x, y, p); + } +} void FrameBuffer::DumpToFile(std::string path) { // int stbi_write_png(char const* filename, int w, int h, int comp, const void* data, int stride_in_bytes); diff --git a/src/display/framebuffer.hpp b/src/display/framebuffer.hpp index 679e6eb..b21118b 100644 --- a/src/display/framebuffer.hpp +++ b/src/display/framebuffer.hpp @@ -33,10 +33,6 @@ public: // for display gamma and to be transposed over to the data buffer void RenderPostProcessSafe(int x, int y, glm::vec3 p); - // Finally, the pixel is ready to be rendered to the data buffer, - // this method adjusts for gamma and scales back to do the last set - uint32_t FinalProcess(glm::vec3 p); - // Sets a pixel on the RenderData framebuffer, ready for rendering // by the display or whatever mode the engine is in. the framebuffer // doesnt care. @@ -51,6 +47,14 @@ public: // if it doesnt exist already void PostProcess(ToneMapMode mode = MODE_TONEMAP_CLAMP); + // Finally, the pixel is ready to be rendered to the data buffer, + // this method adjusts for gamma and scales back to do the last set + uint32_t FinalProcess(glm::vec3 p); + + // Converts the PostProcessed Framebuffer back into a uint32_t + // buffer and processes each pixel, scaling it by gamma + void Ready(); + // Saves the RenderData to a file, data must first be processed // by the render engine / the engine manager based on mode void DumpToFile(std::string path); diff --git a/src/engine/progressiverenderer.cpp b/src/engine/progressiverenderer.cpp index 79e9698..a584a11 100644 --- a/src/engine/progressiverenderer.cpp +++ b/src/engine/progressiverenderer.cpp @@ -109,7 +109,9 @@ void ProgressiveRenderer::Render() { m_threadPool->ThreadFrameBuffer->PostProcess((ToneMapMode)m_toneMapModeSelected); - m_threadPool->MergeBuffers(m_interface->Framebuffer->RenderData, m_scene->w, m_scene->h); + m_threadPool->MergeBuffers(m_interface->Framebuffer); + m_interface->Framebuffer->Ready(); + m_threadPool->RunJobsAgain(); frameEndTime = std::chrono::high_resolution_clock::now(); diff --git a/src/engine/renderengine.cpp b/src/engine/renderengine.cpp index b644c1e..a416cab 100644 --- a/src/engine/renderengine.cpp +++ b/src/engine/renderengine.cpp @@ -45,7 +45,7 @@ void workerThread(RenderThreadPool* threadpool, ProgressiveRenderer* renderer, i glm::vec3 col = renderer->m_engine->GetColour(ray, depth); if (renderer->m_engine->Mode == MODE_RENDER_NORMALS || renderer->m_engine->Mode == MODE_RENDER_PATH_LENGTH) { - threadpool->ThreadFrameBuffer->SetPixelSafe(x, y, col); + threadpool->ThreadFrameBuffer->SetPixelSafe(x, y, col, (int)renderer->m_engine->Mode); } else if (renderer->m_engine->Mode == MODE_RENDER_PATH_BOUNCES) { col.r = depth; col.g = depth / 3.0f; col.b = depth / 3.0f; threadpool->ThreadFrameBuffer->AddPixelSafe(x, y, col, (int)renderer->m_engine->Mode); diff --git a/src/util/threadpool.cpp b/src/util/threadpool.cpp index 90fffc2..c99fd25 100644 --- a/src/util/threadpool.cpp +++ b/src/util/threadpool.cpp @@ -61,8 +61,12 @@ void RenderThreadPool::RunJobsAgain() { ThreadLock.unlock(); } -void RenderThreadPool::MergeBuffers(uint32_t* framebuffer, int w, int h) { - memcpy((void*)framebuffer, (void*)ThreadFrameBuffer->RenderData, (w * h) * sizeof(uint32_t)); +void RenderThreadPool::MergeBuffers(FrameBuffer* framebuffer) { + memcpy((void*)framebuffer->RenderNormalsTarget, (void*)ThreadFrameBuffer->RenderNormalsTarget, (framebuffer->XRes * framebuffer->YRes) * sizeof(glm::vec3)); + memcpy((void*)framebuffer->RenderAlbedoTarget, (void*)ThreadFrameBuffer->RenderAlbedoTarget, (framebuffer->XRes * framebuffer->YRes) * sizeof(glm::vec3)); + memcpy((void*)framebuffer->RenderTarget, (void*)ThreadFrameBuffer->RenderTarget, (framebuffer->XRes * framebuffer->YRes) * sizeof(glm::vec3)); + memcpy((void*)framebuffer->RenderPostProcess, (void*)ThreadFrameBuffer->RenderPostProcess, (framebuffer->XRes * framebuffer->YRes) * sizeof(glm::vec3)); + memcpy((void*)framebuffer->RenderData, (void*)ThreadFrameBuffer->RenderData, (framebuffer->XRes * framebuffer->YRes) * sizeof(uint32_t)); } void RenderThreadPool::Destroy() { diff --git a/src/util/threadpool.hpp b/src/util/threadpool.hpp index 77a92e2..886c58e 100644 --- a/src/util/threadpool.hpp +++ b/src/util/threadpool.hpp @@ -29,7 +29,10 @@ public: void RunJobsAgain(); void Destroy(); - void MergeBuffers(uint32_t* framebuffer, int w, int h); + // Merges threadpools active framebuffer with argument 0 + // sets the data from local to that one. not exaclty merging + // but whatever + void MergeBuffers(FrameBuffer* framebuffer); // std::vector> RenderRegions; // offest, size FrameBuffer* ThreadFrameBuffer; diff --git a/test/main.cpp b/test/main.cpp index 2554272..9b80d07 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -2,8 +2,8 @@ #include "../src/inferno.hpp" -static const int width = 300; -static const int height = 300; +static const int width = 500; +static const int height = 500; int main(int argc, char** argv) { InfernoEngine inferno; @@ -19,7 +19,7 @@ int main(int argc, char** argv) { Scene* scene = new Scene(width, height); scene->camera = new Camera(width, height); - scene->objects.push_back(new Sphere({ 0.0f, 0.0f, -4.0f }, 1.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f, 5.0f))); + scene->objects.push_back(new Sphere({ 0.0f, 0.0f, -4.0f }, 1.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f))); 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 Plane( { 0.0f, -1.0f, 0.0f }, { 0.0f, -1.0f, 0.0f }, new Material({ 0.847f, 0.792f, 0.658f }, 0.2f)));