From 600a3cf25643b075f4603bb7faf76750d31b66f0 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Wed, 9 Nov 2022 05:25:33 +0100 Subject: add depth buffer --- main/draw.cpp | 36 ++++++++++++++++++++++++++---------- main/main-impl.hpp | 5 +++-- 2 files changed, 29 insertions(+), 12 deletions(-) (limited to 'main') diff --git a/main/draw.cpp b/main/draw.cpp index def8e298..90cf27ce 100644 --- a/main/draw.cpp +++ b/main/draw.cpp @@ -5,19 +5,33 @@ #include #include +//#define FM_SKIP_MSAA + namespace floormat { void main_impl::recalc_viewport(Vector2i size) noexcept { update_window_state(); - GL::defaultFramebuffer.setViewport({{}, size }); - _msaa_framebuffer.detach(GL::Framebuffer::ColorAttachment{0}); - _msaa_renderbuffer = Magnum::GL::Renderbuffer{}; - const int samples = std::min(_msaa_renderbuffer.maxSamples(), (int)s.msaa_samples); - _msaa_renderbuffer.setStorageMultisample(samples, GL::RenderbufferFormat::RGBA8, size); - _msaa_framebuffer.setViewport({{}, size }); - _msaa_framebuffer.attachRenderbuffer(GL::Framebuffer::ColorAttachment{0}, _msaa_renderbuffer); _shader.set_scale(Vector2{size}); + GL::defaultFramebuffer.setViewport({{}, size }); + if (_msaa_color.id()) + _msaa_framebuffer.detach(GL::Framebuffer::ColorAttachment{0}); + if (_msaa_depth.id()) + _msaa_framebuffer.detach(GL::Framebuffer::BufferAttachment::DepthStencil); + if (_msaa_framebuffer.id()) + _msaa_framebuffer.setViewport({{}, size}); + else + _msaa_framebuffer = GL::Framebuffer{{{}, size}}; + // --- color --- + _msaa_color = Magnum::GL::Renderbuffer{}; + const int samples = std::min(_msaa_color.maxSamples(), (int)s.msaa_samples); + _msaa_color.setStorageMultisample(samples, GL::RenderbufferFormat::RGBA8, size); + _msaa_framebuffer.attachRenderbuffer(GL::Framebuffer::ColorAttachment{0}, _msaa_color); + // --- depth --- + _msaa_depth = Magnum::GL::Renderbuffer{}; + _msaa_depth.setStorageMultisample(samples, GL::RenderbufferFormat::DepthStencil, size); + _msaa_framebuffer.attachRenderbuffer(GL::Framebuffer::BufferAttachment::DepthStencil, _msaa_depth); + // -- done --- app.on_viewport_event(size); } @@ -119,16 +133,18 @@ void main_impl::drawEvent() _shader.set_tint({1, 1, 1, 1}); { - GL::defaultFramebuffer.clear(GL::FramebufferClear::Color); + using fc = GL::FramebufferClear; + constexpr auto mask = fc::Color | fc::Depth | fc::Stencil; + GL::defaultFramebuffer.clear(mask); #ifndef FM_SKIP_MSAA - _msaa_framebuffer.clear(GL::FramebufferClear::Color); + _msaa_framebuffer.clear(mask); _msaa_framebuffer.bind(); #endif draw_world(); app.draw_msaa(); #ifndef FM_SKIP_MSAA GL::defaultFramebuffer.bind(); - GL::Framebuffer::blit(_msaa_framebuffer, GL::defaultFramebuffer, {{}, windowSize()}, GL::FramebufferBlit::Color); + GL::Framebuffer::blit(_msaa_framebuffer, GL::defaultFramebuffer, {{}, windowSize()}, GL::FramebufferBlit{(unsigned)mask}); #endif } diff --git a/main/main-impl.hpp b/main/main-impl.hpp index f88d3dbc..e62ce261 100644 --- a/main/main-impl.hpp +++ b/main/main-impl.hpp @@ -76,8 +76,9 @@ private: struct draw_bounds final { std::int16_t minx, maxx, miny, maxy; }; - GL::Framebuffer _msaa_framebuffer{{{}, window_size()}}; - GL::Renderbuffer _msaa_renderbuffer{}; + GL::Framebuffer _msaa_framebuffer{NoCreate}; + GL::Renderbuffer _msaa_depth{NoCreate}; + GL::Renderbuffer _msaa_color{NoCreate}; void recalc_viewport(Vector2i size) noexcept; void draw_world() noexcept; -- cgit v1.2.3