Fixed a regression that causes MSAA to not work.
All checks were successful
Run ReCI Build Test / Explore-Gitea-Actions (push) Successful in 2m14s

This commit is contained in:
2025-02-11 16:25:59 -05:00
parent 61c1c3245c
commit 4ac28a2c10
4 changed files with 34 additions and 19 deletions

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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<Vector3> 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 {

View File

@@ -220,20 +220,19 @@ bool JGL::RenderTarget::SetMSAAEnabled(JGL::MSAA_SAMPLE_RATE sample_rate) {
glGetIntegerv(GL_RENDERBUFFER_BINDING, &current_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);