From f10f301443862bca3cf3efdf11768f85fe734e9e Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 13 Dec 2020 23:20:41 +0300 Subject: [PATCH] Deferred renderer: support a background generation callback --- .../include/psemek/gfx/renderer/deferred.hpp | 2 ++ libs/gfx/source/renderer/deferred.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/libs/gfx/include/psemek/gfx/renderer/deferred.hpp b/libs/gfx/include/psemek/gfx/renderer/deferred.hpp index 45618d75..b4aa7147 100644 --- a/libs/gfx/include/psemek/gfx/renderer/deferred.hpp +++ b/libs/gfx/include/psemek/gfx/renderer/deferred.hpp @@ -10,6 +10,7 @@ #include #include +#include namespace psemek::gfx { @@ -95,6 +96,7 @@ namespace psemek::gfx geom::camera const * camera; std::optional clear_color; + util::function background_generator; color_3f ambient; std::vector directional_lights; diff --git a/libs/gfx/source/renderer/deferred.cpp b/libs/gfx/source/renderer/deferred.cpp index e7d0463d..de35b5d6 100644 --- a/libs/gfx/source/renderer/deferred.cpp +++ b/libs/gfx/source/renderer/deferred.cpp @@ -808,6 +808,7 @@ void main() gfx::framebuffer g_framebuffer; gfx::framebuffer occlusion_framebuffer; + gfx::framebuffer bg_framebuffer; gfx::texture_2d g_buffer_texture[4]; gfx::texture_2d g_buffer_depth; @@ -1183,8 +1184,11 @@ void main() impl().g_framebuffer.depth(impl().g_buffer_depth); impl().occlusion_framebuffer.depth(impl().g_buffer_depth); + impl().bg_framebuffer.color(impl().g_buffer_texture[1]); + impl().g_framebuffer.assert_complete(); impl().occlusion_framebuffer.assert_complete(); + impl().bg_framebuffer.assert_complete(); impl().transparent_framebuffer.color(impl().g_buffer_texture[1]); impl().transparent_framebuffer.depth(impl().g_buffer_depth); @@ -1307,6 +1311,19 @@ void main() gl::ClearBufferfv(gl::COLOR, 1, buffer_1_clear); + if (opts.background_generator) + { + impl().bg_framebuffer.bind(); + + gl::Enable(gl::DEPTH_TEST); + gl::DepthFunc(gl::LEQUAL); + gl::Disable(gl::BLEND); + + opts.background_generator(); + + impl().g_framebuffer.bind(); + } + gl::ClearDepth(1.f); gl::Clear(gl::DEPTH_BUFFER_BIT);