48 lines
1.3 KiB
GLSL
48 lines
1.3 KiB
GLSL
[[vertex]]
|
|
|
|
uniform mat4 mvp;
|
|
|
|
in vec4 pos;
|
|
in vec2 uvs;
|
|
out vec2 uv;
|
|
|
|
void main()
|
|
{
|
|
uv = uvs;
|
|
gl_Position = mvp * vec4(pos.xyz, 1.0);
|
|
}
|
|
|
|
[[fragment]]
|
|
|
|
uniform sampler2D tex;
|
|
uniform mediump vec4 col;
|
|
uniform mediump float alpha;
|
|
uniform bool draw_outline;
|
|
|
|
in mediump vec2 uv;
|
|
out mediump vec4 frag;
|
|
|
|
void main()
|
|
{
|
|
mediump float stroke = 1.0 - texture(tex, uv).r;
|
|
if (draw_outline)
|
|
{
|
|
int zero_count = 0;
|
|
if (textureOffset(tex, uv, ivec2(-1, -1)).r > 0.99) zero_count++;
|
|
if (textureOffset(tex, uv, ivec2(-1, 0)).r > 0.99) zero_count++;
|
|
if (textureOffset(tex, uv, ivec2(-1, +1)).r > 0.99) zero_count++;
|
|
if (textureOffset(tex, uv, ivec2( 0, -1)).r > 0.99) zero_count++;
|
|
if (textureOffset(tex, uv, ivec2( 0, 0)).r > 0.99) zero_count++;
|
|
if (textureOffset(tex, uv, ivec2( 0, +1)).r > 0.99) zero_count++;
|
|
if (textureOffset(tex, uv, ivec2(+1, -1)).r > 0.99) zero_count++;
|
|
if (textureOffset(tex, uv, ivec2(+1, 0)).r > 0.99) zero_count++;
|
|
if (textureOffset(tex, uv, ivec2(+1, +1)).r > 0.99) zero_count++;
|
|
mediump float edge = (zero_count > 1 && zero_count < 9) ? 0.75 : 0.0;
|
|
frag = vec4(col.rgb, edge * (1.0 - float(zero_count) / 9.0));
|
|
}
|
|
else
|
|
{
|
|
frag = vec4(col.rgb, stroke * alpha);
|
|
}
|
|
}
|