45 lines
1.1 KiB
Plaintext
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);
|
|
}
|