From 4ac28a2c10ee068f760d252c572261a047891f66 Mon Sep 17 00:00:00 2001 From: Redacted Date: Tue, 11 Feb 2025 16:25:59 -0500 Subject: [PATCH] Fixed a regression that causes MSAA to not work. --- main.cpp | 2 +- src/renderer/OpenGL/J2D.cpp | 38 ++++++++++++++++------- src/renderer/OpenGL/internals/internals.h | 6 ++-- src/types/RenderTarget.cpp | 7 ++--- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/main.cpp b/main.cpp index 3d8ae7a..7a5eacc 100644 --- a/main.cpp +++ b/main.cpp @@ -130,7 +130,7 @@ public: glDepthMask(GL_TRUE); image = new Texture("assets/sprites/Re3D.png", FilteringMode::BILINEAR); image_mask = new Texture("assets/sprites/alpha_mask_2.png"); - j2d_render_target = new RenderTarget({540, 500}, {0,0,0,0}, false, MSAA_SAMPLE_RATE::MSAA_NONE); + j2d_render_target = new RenderTarget({540, 500}, {0,0,0,0}, false, MSAA_SAMPLE_RATE::MSAA_8X); //Texture::MultiplyByAlphaMask(*image, *image_mask); } diff --git a/src/renderer/OpenGL/J2D.cpp b/src/renderer/OpenGL/J2D.cpp index 028ba08..99c6534 100644 --- a/src/renderer/OpenGL/J2D.cpp +++ b/src/renderer/OpenGL/J2D.cpp @@ -5,7 +5,7 @@ void J2D::Begin(RenderTarget* render_target, bool clear_buffers) { - State current_state = default_state; + State new_state = default_state; state_stack.Push(State::SaveState()); glMatrixMode(GL_PROJECTION); @@ -16,27 +16,34 @@ void J2D::Begin(RenderTarget* render_target, bool clear_buffers) { if (!render_target->GetTexture()->Inverted()) Logger::Warning("You're rendering onto a texture that is upside-down. Your draw commands won't work how you'd expect."); - current_state.current_fbo = render_target->GetGLFramebufferObjectHandle(); - current_state.viewport[2] = render_target->GetDimensions().x; - current_state.viewport[3] = render_target->GetDimensions().y; + new_state.current_fbo = render_target->GetGLFramebufferObjectHandle(); + new_state.viewport[2] = render_target->GetDimensions().x; + new_state.viewport[3] = render_target->GetDimensions().y; - current_state.clear_color[0] = render_target->GetClearColor().RN(); - current_state.clear_color[1] = render_target->GetClearColor().GN(); - current_state.clear_color[2] = render_target->GetClearColor().BN(); - current_state.clear_color[3] = render_target->GetClearColor().AN(); + new_state.clear_color[0] = render_target->GetClearColor().RN(); + new_state.clear_color[1] = render_target->GetClearColor().GN(); + new_state.clear_color[2] = render_target->GetClearColor().BN(); + new_state.clear_color[3] = render_target->GetClearColor().AN(); + new_state.current_render_target = render_target; } else { - current_state.viewport[2] = window_size.x; - current_state.viewport[3] = window_size.y; + new_state.viewport[2] = window_size.x; + new_state.viewport[3] = window_size.y; } - State::RestoreState(current_state); + State::RestoreState(new_state); + current_state = new_state; + + if (current_state.current_render_target) + JGL::RenderTarget::SetActiveGLRenderTarget(*current_state.current_render_target); + + if (render_target != nullptr && clear_buffers) { glClearColor(render_target->GetClearColor().RedChannelNormalized(), render_target->GetClearColor().GreenChannelNormalized(), render_target->GetClearColor().BlueChannelNormalized(), render_target->GetClearColor().AlphaChannelNormalized()); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } - glOrtho(0, current_state.viewport[2], current_state.viewport[3], 0, -1, 1); + glOrtho(0, new_state.viewport[2], new_state.viewport[3], 0, -1, 1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -44,6 +51,9 @@ void J2D::Begin(RenderTarget* render_target, bool clear_buffers) { } void J2D::End() { + if (current_state.current_render_target) + current_state.current_render_target->MSAABlit(); + //Change back to the previous projection. glPopMatrix(); glMatrixMode(GL_PROJECTION); @@ -55,6 +65,10 @@ void J2D::End() { Logger::Fatal("Calling J2D::End before J2D::Begin."); State::RestoreState(*previous_state); + if (previous_state->current_render_target) + JGL::RenderTarget::SetActiveGLRenderTarget(*current_state.current_render_target); + + current_state = *previous_state; state_stack.Pop(); } diff --git a/src/renderer/OpenGL/internals/internals.h b/src/renderer/OpenGL/internals/internals.h index 45a554b..fe22a04 100644 --- a/src/renderer/OpenGL/internals/internals.h +++ b/src/renderer/OpenGL/internals/internals.h @@ -20,6 +20,7 @@ public: GLint viewport[4] = {0, 0, 0, 0}; GLint blend_func[2]; GLuint current_fbo = 0; + RenderTarget* current_render_target = nullptr; bool texture_2D = false; bool texture_coordinate_array = false; @@ -57,7 +58,6 @@ namespace JGL { std::vector TriangleMeshVertexNormals(const Vector3* vertices, const size_t& vertex_count, const unsigned int* indices, const size_t& index_count); inline StateStack state_stack; inline Vector2i window_size; - //inline State current_state; } namespace JGL::J2D { @@ -67,11 +67,13 @@ namespace JGL::J2D { {1, 1, 1, 1}, {0, 0, 0, 0}, {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}, - 0, false, false, + 0, nullptr, false, false, false, false, true, true, true, false, 0, {}, {} }; + + inline State current_state; } namespace JGL::J3D { diff --git a/src/types/RenderTarget.cpp b/src/types/RenderTarget.cpp index 74b9c78..9edeaaa 100644 --- a/src/types/RenderTarget.cpp +++ b/src/types/RenderTarget.cpp @@ -220,20 +220,19 @@ bool JGL::RenderTarget::SetMSAAEnabled(JGL::MSAA_SAMPLE_RATE sample_rate) { glGetIntegerv(GL_RENDERBUFFER_BINDING, ¤t_renderbuffer); glGenRenderbuffers(1, &msaa_render_buffer); glBindRenderbuffer(GL_RENDERBUFFER, msaa_render_buffer); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, JGL::to_int(sample_rate), GL_RGBA, size.x, size.y); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, to_int(sample_rate), GL_RGBA, size.x, size.y); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, msaa_render_buffer); if (using_depth) { glGenRenderbuffers(1, &msaa_depth_buffer); glBindRenderbuffer(GL_RENDERBUFFER, msaa_depth_buffer); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, JGL::to_int(sample_rate), GL_DEPTH_COMPONENT, size.x, size.y); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, to_int(sample_rate), GL_DEPTH_COMPONENT, size.x, size.y); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, msaa_depth_buffer); } bool failure = false; if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - failure = true, - Logger::Fatal("A new MSAA " + std::to_string(to_int(sample_rate)) + "x framebuffer couldn't be allocated."); + failure = true, Logger::Fatal("A new " + to_string(sample_rate) + " framebuffer couldn't be allocated."); glBindRenderbuffer(GL_RENDERBUFFER, current_renderbuffer); glBindFramebuffer(GL_FRAMEBUFFER, current_fbo);