From f37edd524f03ed373415a6a26c1c9f02d4e5c8b5 Mon Sep 17 00:00:00 2001 From: Allen Pestaluky Date: Wed, 16 Jul 2025 13:55:20 -0400 Subject: [PATCH] Fix clear color being incorrect in `Environment` background with HDR 2D. --- servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp | 3 +++ servers/rendering/renderer_rd/renderer_compositor_rd.cpp | 2 ++ .../rendering/renderer_rd/storage_rd/texture_storage.cpp | 2 +- servers/rendering/rendering_device.h | 6 ++++++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 89322b3d2ea..eeb4df1c13d 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -2276,6 +2276,9 @@ void RendererCanvasRenderRD::_render_batch_items(RenderTarget p_to_render_target if (texture_storage->render_target_is_clear_requested(p_to_render_target.render_target)) { clear = true; clear_color = texture_storage->render_target_get_clear_request_color(p_to_render_target.render_target); + if (texture_storage->render_target_is_using_hdr(p_to_render_target.render_target)) { + clear_color = clear_color.srgb_to_linear(); + } texture_storage->render_target_disable_clear_request(p_to_render_target.render_target); } // TODO: Obtain from framebuffer format eventually when this is implemented. diff --git a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp index 00627b14c70..517d8337298 100644 --- a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp @@ -219,6 +219,8 @@ void RendererCompositorRD::set_boot_image_with_stretch(const Ref &p_image screenrect.position /= window_size; screenrect.size /= window_size; + // p_color never needs to be converted to linear encoding because HDR 2D is always disabled for the boot image. + // If HDR 2D can ever be enabled during the boot image, p_color must be converted to linear encoding for this case. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin_for_screen(DisplayServer::MAIN_WINDOW_ID, p_color); RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blit.pipelines[BLIT_MODE_NORMAL_ALPHA]); diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index d3af44708a7..083ade50c3b 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -4029,7 +4029,7 @@ bool TextureStorage::render_target_is_clear_requested(RID p_render_target) { Color TextureStorage::render_target_get_clear_request_color(RID p_render_target) { RenderTarget *rt = render_target_owner.get_or_null(p_render_target); ERR_FAIL_NULL_V(rt, Color()); - return rt->use_hdr ? rt->clear_color.srgb_to_linear() : rt->clear_color; + return rt->clear_color; } void TextureStorage::render_target_disable_clear_request(RID p_render_target) { diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index ea29a185155..4ca7b32adb8 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -1366,7 +1366,13 @@ public: DRAW_IGNORE_ALL = DRAW_IGNORE_COLOR_ALL | DRAW_IGNORE_DEPTH | DRAW_IGNORE_STENCIL }; + /** + * @param p_clear_color Must use linear encoding when HDR 2D is active. + */ DrawListID draw_list_begin_for_screen(DisplayServer::WindowID p_screen = 0, const Color &p_clear_color = Color()); + /** + * @param p_clear_color_values Color values must use linear encoding when HDR 2D is active. + */ DrawListID draw_list_begin(RID p_framebuffer, BitField p_draw_flags = DRAW_DEFAULT_ALL, VectorView p_clear_color_values = VectorView(), float p_clear_depth_value = 1.0f, uint32_t p_clear_stencil_value = 0, const Rect2 &p_region = Rect2(), uint32_t p_breadcrumb = 0); DrawListID _draw_list_begin_bind(RID p_framebuffer, BitField p_draw_flags = DRAW_DEFAULT_ALL, const Vector &p_clear_color_values = Vector(), float p_clear_depth_value = 1.0f, uint32_t p_clear_stencil_value = 0, const Rect2 &p_region = Rect2(), uint32_t p_breadcrumb = 0);