From c5d21df245b01f1d2e7dd21779ce3977cb122669 Mon Sep 17 00:00:00 2001 From: Clay John Date: Mon, 19 Jan 2026 14:49:07 -0800 Subject: [PATCH] Increase precision of ninepatch source rect to ensure pixel perfect alignment --- .../renderer_rd/renderer_canvas_render_rd.cpp | 2 +- servers/rendering/renderer_rd/shaders/canvas.glsl | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index e723242bad..abc20b44d5 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1840,7 +1840,7 @@ RendererCanvasRenderRD::RendererCanvasRenderRD() { actions.base_uniform_string = "material."; actions.default_filter = ShaderLanguage::FILTER_LINEAR; actions.default_repeat = ShaderLanguage::REPEAT_DISABLE; - actions.base_varying_index = 8; + actions.base_varying_index = 9; actions.global_buffer_array_variable = "global_shader_uniforms.data"; actions.instance_uniform_index_variable = "read_draw_data_instance_offset"; diff --git a/servers/rendering/renderer_rd/shaders/canvas.glsl b/servers/rendering/renderer_rd/shaders/canvas.glsl index 58d75c761b..20453071f8 100644 --- a/servers/rendering/renderer_rd/shaders/canvas.glsl +++ b/servers/rendering/renderer_rd/shaders/canvas.glsl @@ -36,7 +36,8 @@ layout(location = 4) out flat uvec4 varying_C; #ifdef USE_NINEPATCH layout(location = 5) out flat vec4 varying_D; layout(location = 6) out flat vec4 varying_E; -layout(location = 7) out vec2 pixel_size_interp; +layout(location = 7) out flat vec4 varying_F; +layout(location = 8) out vec2 pixel_size_interp; #endif // USE_NINEPATCH #endif // !USE_ATTRIBUTES @@ -131,6 +132,7 @@ void main() { #ifdef USE_NINEPATCH varying_D = read_draw_data_ninepatch_margins; varying_E = vec4(read_draw_data_dst_rect.z, read_draw_data_dst_rect.w, read_draw_data_ninepatch_pixel_size.x, read_draw_data_ninepatch_pixel_size.y); + varying_F = read_draw_data_src_rect; #endif // USE_NINEPATCH #endif // !USE_ATTRIBUTES @@ -339,11 +341,14 @@ layout(location = 4) in flat uvec4 varying_C; #ifdef USE_NINEPATCH layout(location = 5) in flat vec4 varying_D; layout(location = 6) in flat vec4 varying_E; -layout(location = 7) in vec2 pixel_size_interp; +layout(location = 7) in flat vec4 varying_F; +layout(location = 8) in vec2 pixel_size_interp; #define read_draw_data_ninepatch_margins varying_D #define read_draw_data_dst_rect_z varying_E.x #define read_draw_data_dst_rect_w varying_E.y #define read_draw_data_ninepatch_pixel_size (varying_E.zw) +#define read_draw_data_src_rect_ninepatch (varying_F); + #endif // USE_NINEPATCH #endif // USE_ATTRIBUTES @@ -586,7 +591,9 @@ void main() { color.a = 0.0; } - uv = uv * src_rect.zw + src_rect.xy; //apply region if needed + vec4 ninepatch_src_rect = read_draw_data_src_rect_ninepatch; + + uv = uv * ninepatch_src_rect.zw + ninepatch_src_rect.xy; //apply region if needed #endif if (bool(read_draw_data_flags & INSTANCE_FLAGS_CLIP_RECT_UV)) {