From 6effd3cde7a481b57226cf5d03c97aa5728ff7e7 Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Tue, 25 Jul 2023 04:20:07 -0500 Subject: [PATCH] Fix transparent viewport backgrounds with custom clear color --- drivers/gles3/rasterizer_scene_gles3.cpp | 3 ++- .../storage/render_scene_buffers_gles3.cpp | 6 ------ .../gles3/storage/render_scene_buffers_gles3.h | 2 -- .../forward_mobile/render_forward_mobile.cpp | 18 ++++++++++++------ 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index d8ddfe5c326..6791a9db5ea 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1738,7 +1738,7 @@ void RasterizerSceneGLES3::render_scene(const Ref &p_render_ RenderDataGLES3 render_data; { render_data.render_buffers = rb; - render_data.transparent_bg = rb.is_valid() ? rb->is_transparent : false; + render_data.transparent_bg = rb.is_valid() ? rt->is_transparent : false; // Our first camera is used by default render_data.cam_transform = p_camera_data->main_transform; render_data.inv_cam_transform = render_data.cam_transform.affine_inverse(); @@ -1984,6 +1984,7 @@ void RasterizerSceneGLES3::render_scene(const Ref &p_render_ } if (!keep_color) { + clear_color.a = render_data.transparent_bg ? 0.0f : 1.0f; glClearBufferfv(GL_COLOR, 0, clear_color.components); } RENDER_TIMESTAMP("Render Opaque Pass"); diff --git a/drivers/gles3/storage/render_scene_buffers_gles3.cpp b/drivers/gles3/storage/render_scene_buffers_gles3.cpp index 76c0097bab0..829574cae04 100644 --- a/drivers/gles3/storage/render_scene_buffers_gles3.cpp +++ b/drivers/gles3/storage/render_scene_buffers_gles3.cpp @@ -38,8 +38,6 @@ RenderSceneBuffersGLES3::~RenderSceneBuffersGLES3() { } void RenderSceneBuffersGLES3::configure(const RenderSceneBuffersConfiguration *p_config) { - GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton(); - //internal_size.x = p_config->get_internal_size().x; // ignore for now //internal_size.y = p_config->get_internal_size().y; width = p_config->get_target_size().x; @@ -54,10 +52,6 @@ void RenderSceneBuffersGLES3::configure(const RenderSceneBuffersConfiguration *p view_count = p_config->get_view_count(); free_render_buffer_data(); - - GLES3::RenderTarget *rt = texture_storage->get_render_target(render_target); - - is_transparent = rt->is_transparent; } void RenderSceneBuffersGLES3::free_render_buffer_data() { diff --git a/drivers/gles3/storage/render_scene_buffers_gles3.h b/drivers/gles3/storage/render_scene_buffers_gles3.h index 64b95c417c2..aa98797ed1b 100644 --- a/drivers/gles3/storage/render_scene_buffers_gles3.h +++ b/drivers/gles3/storage/render_scene_buffers_gles3.h @@ -58,8 +58,6 @@ public: //bool use_debanding = false; uint32_t view_count = 1; - bool is_transparent = false; - RID render_target; //built-in textures used for ping pong image processing and blurring diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index 6434682fc25..077bf4e3b74 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -908,13 +908,19 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color { // regular forward for now Vector c; - c.push_back(clear_color.srgb_to_linear()); // our render buffer - if (rb_data.is_valid()) { - if (p_render_data->render_buffers->get_msaa_3d() != RS::VIEWPORT_MSAA_DISABLED) { - c.push_back(clear_color.srgb_to_linear()); // our resolve buffer + { + Color cc = clear_color.srgb_to_linear(); + if (rb_data.is_valid()) { + cc.a = 0; // For transparent viewport backgrounds. } - if (using_subpass_post_process) { - c.push_back(Color()); // our 2D buffer we're copying into + c.push_back(cc); // Our render buffer. + if (rb_data.is_valid()) { + if (p_render_data->render_buffers->get_msaa_3d() != RS::VIEWPORT_MSAA_DISABLED) { + c.push_back(clear_color.srgb_to_linear()); // Our resolve buffer. + } + if (using_subpass_post_process) { + c.push_back(Color()); // Our 2D buffer we're copying into. + } } }