47 lines
1.1 KiB
Plaintext
47 lines
1.1 KiB
Plaintext
shader_type canvas_item;
|
|
render_mode blend_premul_alpha;
|
|
|
|
uniform sampler2D u_alpha_tex;
|
|
uniform int u_distance = 16;
|
|
uniform bool u_alpha_overwrite = true;
|
|
|
|
|
|
vec4 dilate(sampler2D a_tex, sampler2D tex, vec2 coords, vec2 texel_size, int dist, float alpha_cutoff)
|
|
{
|
|
|
|
vec2 offsets[8] = {
|
|
vec2(-1,0),vec2(1,0), vec2(0,1), vec2(0,-1),
|
|
vec2(-1,1), vec2(1,1), vec2(1,-1), vec2(-1,-1)
|
|
};
|
|
|
|
vec4 sample = textureLod(tex, coords, 0);
|
|
vec4 a_sample = textureLod(a_tex, coords, 0);
|
|
if(a_sample.a > alpha_cutoff)
|
|
return sample;
|
|
|
|
for(int curr_dist = 0; curr_dist < dist; curr_dist++)
|
|
{
|
|
for(int o = 0; o < 8; o++)
|
|
{
|
|
vec2 off_coords = offsets[o] * texel_size * float(curr_dist + 1);
|
|
vec4 off_sample = textureLod(tex, coords + off_coords, 0);
|
|
vec4 off_a_sample = textureLod(a_tex, coords + off_coords, 0);
|
|
|
|
if (off_a_sample.a > alpha_cutoff)
|
|
{
|
|
if(u_alpha_overwrite)
|
|
return off_sample;
|
|
else
|
|
return vec4(off_sample.rgb, a_sample.a);
|
|
}
|
|
|
|
}
|
|
}
|
|
return sample;
|
|
}
|
|
|
|
void fragment() {
|
|
COLOR = dilate(u_alpha_tex, TEXTURE, UV, TEXTURE_PIXEL_SIZE, u_distance, 0.95);
|
|
//COLOR.a = 1.0;
|
|
}
|