summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-10-01 17:31:17 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-10-01 17:31:17 +0200
commit6c133054f7b19c4e441f7c4c72168068a723276c (patch)
tree73c59f298b13651af5e8443329286da3f19bddb5
parent3b17e3470a84eb7f375b4eeac5217634816dfe3e (diff)
parentd720eb80e176bf7455f37cfff9e336c95bc911f4 (diff)
downloadredot-engine-6c133054f7b19c4e441f7c4c72168068a723276c.tar.gz
Merge pull request #97602 from patowen/fix-region-filter-clip-enabled
Fix `region_filter_clip_enabled` to avoid sprite bleeding for interpolated sprite sheets
-rw-r--r--doc/classes/Sprite2D.xml2
-rw-r--r--drivers/gles3/shaders/canvas.glsl3
-rw-r--r--servers/rendering/renderer_rd/shaders/canvas.glsl3
3 files changed, 5 insertions, 3 deletions
diff --git a/doc/classes/Sprite2D.xml b/doc/classes/Sprite2D.xml
index d73cb02d94..239c4dcf09 100644
--- a/doc/classes/Sprite2D.xml
+++ b/doc/classes/Sprite2D.xml
@@ -76,7 +76,7 @@
If [code]true[/code], texture is cut from a larger atlas texture. See [member region_rect].
</member>
<member name="region_filter_clip_enabled" type="bool" setter="set_region_filter_clip_enabled" getter="is_region_filter_clip_enabled" default="false">
- If [code]true[/code], the outermost pixels get blurred out. [member region_enabled] must be [code]true[/code].
+ If [code]true[/code], the area outside of the [member region_rect] is clipped to avoid bleeding of the surrounding texture pixels. [member region_enabled] must be [code]true[/code].
</member>
<member name="region_rect" type="Rect2" setter="set_region_rect" getter="get_region_rect" default="Rect2(0, 0, 0, 0)">
The region of the atlas texture to display. [member region_enabled] must be [code]true[/code].
diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl
index 76881c8032..5e7fb3b338 100644
--- a/drivers/gles3/shaders/canvas.glsl
+++ b/drivers/gles3/shaders/canvas.glsl
@@ -579,7 +579,8 @@ void main() {
#endif
if (bool(read_draw_data_flags & FLAGS_CLIP_RECT_UV)) {
- uv = clamp(uv, read_draw_data_src_rect.xy, read_draw_data_src_rect.xy + abs(read_draw_data_src_rect.zw));
+ vec2 half_texpixel = read_draw_data_color_texture_pixel_size * 0.5;
+ uv = clamp(uv, read_draw_data_src_rect.xy + half_texpixel, read_draw_data_src_rect.xy + abs(read_draw_data_src_rect.zw) - half_texpixel);
}
#endif
diff --git a/servers/rendering/renderer_rd/shaders/canvas.glsl b/servers/rendering/renderer_rd/shaders/canvas.glsl
index 704aafdfa5..fd0cd5bfad 100644
--- a/servers/rendering/renderer_rd/shaders/canvas.glsl
+++ b/servers/rendering/renderer_rd/shaders/canvas.glsl
@@ -493,7 +493,8 @@ void main() {
#endif
if (bool(draw_data.flags & FLAGS_CLIP_RECT_UV)) {
- uv = clamp(uv, draw_data.src_rect.xy, draw_data.src_rect.xy + abs(draw_data.src_rect.zw));
+ vec2 half_texpixel = draw_data.color_texture_pixel_size * 0.5;
+ uv = clamp(uv, draw_data.src_rect.xy + half_texpixel, draw_data.src_rect.xy + abs(draw_data.src_rect.zw) - half_texpixel);
}
#endif