diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 941b1a1b2805..8e9b0c2f2901 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -341,10 +341,15 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ normal_transform.columns[2] = Vector2(); _update_transform_2d_to_mat4(normal_transform, state_buffer.canvas_normal_transform); - state_buffer.canvas_modulate[0] = p_modulate.r; - state_buffer.canvas_modulate[1] = p_modulate.g; - state_buffer.canvas_modulate[2] = p_modulate.b; - state_buffer.canvas_modulate[3] = p_modulate.a; + bool use_linear_colors = texture_storage->render_target_is_using_hdr(p_to_render_target); + Color modulate = p_modulate; + if (use_linear_colors) { + modulate = p_modulate.srgb_to_linear(); + } + state_buffer.canvas_modulate[0] = modulate.r; + state_buffer.canvas_modulate[1] = modulate.g; + state_buffer.canvas_modulate[2] = modulate.b; + state_buffer.canvas_modulate[3] = modulate.a; Size2 render_target_size = texture_storage->render_target_get_size(p_to_render_target); state_buffer.screen_pixel_size[0] = 1.0 / render_target_size.x; diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index e58e45f13e00..5c68fb82b1fd 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1451,10 +1451,15 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p normal_transform.columns[2] = Vector2(); _update_transform_2d_to_mat4(normal_transform, state_buffer.canvas_normal_transform); - state_buffer.canvas_modulate[0] = p_modulate.r; - state_buffer.canvas_modulate[1] = p_modulate.g; - state_buffer.canvas_modulate[2] = p_modulate.b; - state_buffer.canvas_modulate[3] = p_modulate.a; + bool use_linear_colors = texture_storage->render_target_is_using_hdr(p_to_render_target); + Color modulate = p_modulate; + if (use_linear_colors) { + modulate = p_modulate.srgb_to_linear(); + } + state_buffer.canvas_modulate[0] = modulate.r; + state_buffer.canvas_modulate[1] = modulate.g; + state_buffer.canvas_modulate[2] = modulate.b; + state_buffer.canvas_modulate[3] = modulate.a; Size2 render_target_size = texture_storage->render_target_get_size(p_to_render_target); state_buffer.screen_pixel_size[0] = 1.0 / render_target_size.x;