Files
Sprout-Farm/SproutFarm-Frontend/Shader/OutlineforAtlasTexture.gdshader
2025-09-15 19:10:37 +08:00

45 lines
1.1 KiB
Plaintext

shader_type canvas_item;
uniform float outline_width = 1.0;
uniform vec4 outline_color : source_color;
uniform vec4 texture_region = vec4(0.0);
void fragment() {
vec4 color = texture(TEXTURE, UV);
vec2 outline_offset = vec2(outline_width) * TEXTURE_PIXEL_SIZE;
vec4 uv_region = vec4(texture_region.xy * TEXTURE_PIXEL_SIZE, texture_region.zw * TEXTURE_PIXEL_SIZE);
if (uv_region.zw == vec2(0.0)) {
uv_region.zw = vec2(1.0);
}
float uv_offset;
float a;
float max_a = 0.0;
uv_offset = UV.y - outline_offset.y;
if (uv_offset > uv_region.y) {
a = texture(TEXTURE, vec2(UV.x, uv_offset)).a;
max_a = max(a, max_a);
}
uv_offset = UV.y + outline_offset.y;
if (uv_offset < uv_region.y + uv_region.w) {
a = texture(TEXTURE, vec2(UV.x, uv_offset)).a;
max_a = max(a, max_a);
}
uv_offset = UV.x - outline_offset.x;
if (uv_offset > uv_region.x) {
a = texture(TEXTURE, vec2(uv_offset, UV.y)).a;
max_a = max(a, max_a);
}
uv_offset = UV.x + outline_offset.x;
if (uv_offset < uv_region.x + uv_region.z) {
a = texture(TEXTURE, vec2(uv_offset, UV.y)).a;
max_a = max(a, max_a);
}
COLOR = mix(color, outline_color, max_a - color.a);
}