diff --git a/Image_01.png b/Image_01.png new file mode 100644 index 0000000..b19f991 Binary files /dev/null and b/Image_01.png differ diff --git a/PathTracer/src/Renderer.cpp b/PathTracer/src/Renderer.cpp index 885ef13..b35ca3d 100644 --- a/PathTracer/src/Renderer.cpp +++ b/PathTracer/src/Renderer.cpp @@ -27,6 +27,7 @@ void Renderer::OnResize(uint32_t width, uint32_t height) { return; finalImage->Resize(width, height); + } else { finalImage = std::make_shared(width, height, Walnut::ImageFormat::RGBA); @@ -37,6 +38,18 @@ void Renderer::OnResize(uint32_t width, uint32_t height) { delete[] accumulationData; accumulationData = new glm::vec4[width * height]; + + imageHorizontalIterator.resize(width); + imageVerticalIterator.resize(height); + + for (uint32_t i = 0; i < width; i++) + { + imageHorizontalIterator[i] = i; + } + for (uint32_t i = 0; i < height; i++) + { + imageVerticalIterator[i] = i; + } } void Renderer::Render(const Scene& scene, const Camera& camera) { @@ -47,6 +60,24 @@ void Renderer::Render(const Scene& scene, const Camera& camera) { if (frameIndex == 1) memset(accumulationData, 0, finalImage->GetHeight() * finalImage->GetWidth() * sizeof(glm::vec4)); +#define M_T 1 +#if M_T 1 + std::for_each(std::execution::par, imageVerticalIterator.begin(), imageVerticalIterator.end(), + [this](uint32_t y) { + std::for_each(std::execution::par, imageHorizontalIterator.begin(), imageHorizontalIterator.end(), + [this, y](uint32_t x) { + glm::vec4 color = RayGeneration(x, y); + + accumulationData[x + y * finalImage->GetWidth()] += color; + + glm::vec4 accumulatedColor = accumulationData[x + y * finalImage->GetWidth()]; + accumulatedColor /= (float)frameIndex; + accumulatedColor = glm::clamp(accumulatedColor, glm::vec4(0.0f), glm::vec4(1.0f)); + + m_ImageData[x + finalImage->GetWidth() * y] = Utilities::ConvertToRGBA(accumulatedColor); + }); + }); +#else for (uint32_t y = 0; y < finalImage->GetHeight(); y++) { for (uint32_t x = 0; x < finalImage->GetWidth(); x++) { @@ -63,7 +94,7 @@ void Renderer::Render(const Scene& scene, const Camera& camera) { } } - +#endif finalImage->SetData(m_ImageData); diff --git a/PathTracer/src/Renderer.h b/PathTracer/src/Renderer.h index 2487dd6..bcfc5a4 100644 --- a/PathTracer/src/Renderer.h +++ b/PathTracer/src/Renderer.h @@ -5,6 +5,7 @@ #include "Walnut/Random.h" #include "Camera.h" #include "Ray.h" +#include #include "Scene.h" @@ -13,7 +14,7 @@ class Renderer { public: struct Settings { - bool Accumulate = false; + bool Accumulate = true; }; Renderer() = default; @@ -45,6 +46,8 @@ class Renderer { std::shared_ptr finalImage; glm::vec4 RayGeneration(uint32_t x, uint32_t y); + std::vector imageHorizontalIterator, imageVerticalIterator; + const Scene* activeScene = nullptr; const Camera* activeCamera = nullptr; diff --git a/README.md b/README.md index 8b13789..7b114d9 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ +### Path Tracer +#### Images: + +![](file:///C:/Users/moham/Documents/GitHub/Vulkan-Based-Path-Tracer/Image_01.png)