cirnogodot/VFEZ/Shaders/Effects/vfez_outline_inner.gdshaderinc
2025-03-09 15:58:26 +01:00

40 lines
1.3 KiB
Text

group_uniforms outline_inner;
uniform bool only_render_inner_outline;
uniform vec3 outline_inner_color: source_color;
uniform float outline_inner_thickness: hint_range(0., 5.) = 1.;
uniform float outline_inner_alpha: hint_range(0., 1.) = 1.;
uniform float ouline_inner_glow: hint_range(1., 10.) = 1.;
group_uniforms;
vec3 get_pixel(float offsetX, float offsetY, vec2 uv, sampler2D tex, vec2 texture_pixel_size)
{
return texture(tex, (uv + vec2(offsetX * texture_pixel_size.x, offsetY * texture_pixel_size.y))).rgb;
}
vec4 outline_inner(vec4 color, vec2 texture_pixel_size, vec2 uv, sampler2D tex)
{
vec3 innerT = abs(
get_pixel(0., outline_inner_thickness, uv, tex, texture_pixel_size) -
get_pixel(0., - outline_inner_thickness, uv, tex, texture_pixel_size)
);
innerT += abs(
get_pixel(outline_inner_thickness, 0., uv, tex, texture_pixel_size) -
get_pixel(-outline_inner_thickness, 0., uv, tex, texture_pixel_size)
);
if (only_render_inner_outline)
{
innerT *= color.a * outline_inner_alpha;
color.rgb = length(innerT) * outline_inner_color * ouline_inner_glow;
color.a = step(0.3, color.r + color.g + color.b);
}
else
{
innerT = innerT / 2.0 * color.a * outline_inner_alpha;
color.rgb += length(innerT) * outline_inner_color * ouline_inner_glow;
}
return color;
}