Fixed a regression that causes MSAA to not work.
All checks were successful
Run ReCI Build Test / Explore-Gitea-Actions (push) Successful in 2m14s
All checks were successful
Run ReCI Build Test / Explore-Gitea-Actions (push) Successful in 2m14s
This commit is contained in:
2
main.cpp
2
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);
|
||||
}
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -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 {
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user