From 830f25010f062cc1aea1a3e48746aab29addf561 Mon Sep 17 00:00:00 2001 From: Alex Threlfo Date: Sat, 14 Dec 2024 14:34:18 +1100 Subject: [PATCH] fix: canvas background mode not clearing correctly when using gles3 glow effect --- drivers/gles3/rasterizer_scene_gles3.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 8c05dff79a..71210d5049 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -2380,6 +2380,7 @@ void RasterizerSceneGLES3::render_scene(const Ref &p_render_ bool draw_sky = false; bool draw_sky_fog_only = false; bool keep_color = false; + bool draw_canvas = false; bool draw_feed = false; float sky_energy_multiplier = 1.0; int camera_feed_id = -1; @@ -2421,7 +2422,7 @@ void RasterizerSceneGLES3::render_scene(const Ref &p_render_ draw_sky = !render_data.transparent_bg; } break; case RS::ENV_BG_CANVAS: { - keep_color = true; + draw_canvas = true; } break; case RS::ENV_BG_KEEP: { keep_color = true; @@ -2429,6 +2430,7 @@ void RasterizerSceneGLES3::render_scene(const Ref &p_render_ case RS::ENV_BG_CAMERA_FEED: { camera_feed_id = environment_get_camera_feed_id(render_data.environment); draw_feed = true; + keep_color = true; } break; default: { } @@ -2540,10 +2542,14 @@ void RasterizerSceneGLES3::render_scene(const Ref &p_render_ glClear(GL_DEPTH_BUFFER_BIT); } - if (!keep_color && !draw_feed) { + // Need to clear framebuffer unless: + // a) We explicitly request not to (i.e. ENV_BG_KEEP). + // b) We are rendering to a non-intermediate framebuffer with ENV_BG_CANVAS (shared between 2D and 3D). + if (!keep_color && (!draw_canvas || fbo != rt->fbo)) { clear_color.a = render_data.transparent_bg ? 0.0f : 1.0f; glClearBufferfv(GL_COLOR, 0, clear_color.components); - } else if (fbo != rt->fbo) { + } + if ((keep_color || draw_canvas) && fbo != rt->fbo) { // Need to copy our current contents to our intermediate/MSAA buffer GLES3::CopyEffects *copy_effects = GLES3::CopyEffects::get_singleton();