From 0908afef0fea7c0d4b60ab0e7016176b07f56050 Mon Sep 17 00:00:00 2001 From: TheRedShip Date: Sun, 9 Mar 2025 16:01:03 +0100 Subject: [PATCH] ~ | Fixing fog lighting acne and denoising not clearing --- includes/RT/Window.hpp | 2 +- shaders/light.glsl | 6 +++--- srcs/RT.cpp | 2 +- srcs/class/Window.cpp | 9 +++++++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/includes/RT/Window.hpp b/includes/RT/Window.hpp index 2d15585..3656d73 100644 --- a/includes/RT/Window.hpp +++ b/includes/RT/Window.hpp @@ -38,7 +38,7 @@ class Window static void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods); void imGuiNewFrame(); - void imGuiRender(ShaderProgram &raytracing_program); + void imGuiRender(ShaderProgram &raytracing_program, std::vector &textures); GLFWwindow *getWindow(void) const; float getFps(void) const; diff --git a/shaders/light.glsl b/shaders/light.glsl index 857f884..db54736 100644 --- a/shaders/light.glsl +++ b/shaders/light.glsl @@ -84,7 +84,7 @@ vec3 sampleSphereLight(vec3 position, GPUObject obj, int light_index, GPUMateria } float cos_theta = max(0.0, -dot(light_dir, normalize(sample_point - obj.position))); - return mat.emission * mat.color / (light_dist * light_dist) * cos_theta / (4.0 * M_PI * (obj.radius / 2.0) * (obj.radius / 2.0)); + return mat.emission * mat.color / max(light_dist * light_dist, 1.0) * cos_theta / (4.0 * M_PI * (obj.radius / 2.0) * (obj.radius / 2.0)); } vec3 sampleQuadLight(vec3 position, GPUObject obj, int light_index, GPUMaterial mat, inout uint rng_state) @@ -123,8 +123,8 @@ vec3 sampleQuadLight(vec3 position, GPUObject obj, int light_index, GPUMaterial float area = length(crossQuad); float pdf = 1.0 / area; - float cos_theta = max(0.0, dot(obj.normal, -light_dir)); - return mat.emission * mat.color / (light_dist * light_dist) * pdf; + // float cos_theta = max(0.0, dot(obj.normal, -light_dir)); + return mat.emission * mat.color / max(light_dist * light_dist, 1.); } vec3 sampleLights(in vec3 position, inout uint rng_state) diff --git a/srcs/RT.cpp b/srcs/RT.cpp index 9030501..d9ccbd9 100644 --- a/srcs/RT.cpp +++ b/srcs/RT.cpp @@ -100,7 +100,7 @@ int main(int argc, char **argv) render_program.use(); drawScreenTriangle(VAO, textures[window.getOutputTexture()], render_program.getProgram()); - window.imGuiRender(raytracing_program); + window.imGuiRender(raytracing_program, textures); window.display(); window.pollEvents(); diff --git a/srcs/class/Window.cpp b/srcs/class/Window.cpp index a3172a1..6b926d0 100644 --- a/srcs/class/Window.cpp +++ b/srcs/class/Window.cpp @@ -192,7 +192,7 @@ void Window::imGuiNewFrame() ImGui::NewFrame(); } -void Window::imGuiRender(ShaderProgram &raytracing_program) +void Window::imGuiRender(ShaderProgram &raytracing_program, std::vector &textures) { bool has_changed = false; @@ -290,7 +290,12 @@ void Window::imGuiRender(ShaderProgram &raytracing_program) if (ImGui::CollapsingHeader("Denoiser")) { - ImGui::Checkbox("Enable##1", (bool *)(&_scene->getDenoise().enabled)); + if (ImGui::Checkbox("Enable##1", (bool *)(&_scene->getDenoise().enabled))) + { + //clear denoising texture + glClearTexImage(textures[3], 0, GL_RGBA, GL_FLOAT, nullptr); + glClearTexImage(textures[4], 0, GL_RGBA, GL_FLOAT, nullptr); + } ImGui::Separator(); if (ImGui::SliderInt("Pass", &_scene->getDenoise().pass, 0, 8)) _scene->getDenoise().pass = (_scene->getDenoise().pass / 2) * 2; // make sure it's even