105 lines
2.4 KiB
GLSL
105 lines
2.4 KiB
GLSL
|
|
||
|
in vec4 gl_FragCoord;
|
||
|
|
||
|
#request uniform "screen" screen
|
||
|
uniform ivec2 screen; /* screen dimensions */
|
||
|
|
||
|
#request uniform "prev" tex
|
||
|
uniform sampler2D tex; /* screen texture */
|
||
|
|
||
|
out vec4 fragment; /* output */
|
||
|
|
||
|
#include "@graph.glsl"
|
||
|
#include ":graph.glsl"
|
||
|
|
||
|
#if ANTI_ALIAS == 0
|
||
|
#error __disablestage
|
||
|
#endif
|
||
|
|
||
|
/* Moves toward the border of the graph, gives the
|
||
|
y coordinate of the last colored pixel */
|
||
|
float get_col_height_up(float x, float oy) {
|
||
|
float y = oy;
|
||
|
#if INVERT > 0
|
||
|
while (y >= 0) {
|
||
|
#else
|
||
|
while (y < screen.y) {
|
||
|
#endif
|
||
|
vec4 f = texelFetch(tex, ivec2(x, y), 0);
|
||
|
if (f.a <= 0) {
|
||
|
#if INVERT > 0
|
||
|
y += 1;
|
||
|
#else
|
||
|
y -= 1;
|
||
|
#endif
|
||
|
break;
|
||
|
}
|
||
|
#if INVERT > 0
|
||
|
y -= 1;
|
||
|
#else
|
||
|
y += 1;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
return y;
|
||
|
}
|
||
|
|
||
|
/* Moves toward the base of the graph, gives the
|
||
|
y coordinate of the first colored pixel */
|
||
|
float get_col_height_down(float x, float oy) {
|
||
|
float y = oy;
|
||
|
#if INVERT > 0
|
||
|
while (y < screen.y) {
|
||
|
#else
|
||
|
while (y >= 0) {
|
||
|
#endif
|
||
|
vec4 f = texelFetch(tex, ivec2(x, y), 0);
|
||
|
if (f.a > 0) {
|
||
|
break;
|
||
|
}
|
||
|
#if INVERT > 0
|
||
|
y += 1;
|
||
|
#else
|
||
|
y -= 1;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
return y;
|
||
|
}
|
||
|
|
||
|
void main() {
|
||
|
fragment = texelFetch(tex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);
|
||
|
|
||
|
#if ANTI_ALIAS > 0
|
||
|
|
||
|
if (fragment.a <= 0) {
|
||
|
bool left_done = false;
|
||
|
float h2;
|
||
|
float a_fact = 0;
|
||
|
|
||
|
if (texelFetch(tex, ivec2(gl_FragCoord.x - 1, gl_FragCoord.y), 0).a > 0) {
|
||
|
float h1 = get_col_height_up(gl_FragCoord.x - 1, gl_FragCoord.y);
|
||
|
h2 = get_col_height_down(gl_FragCoord.x, gl_FragCoord.y);
|
||
|
fragment = texelFetch(tex, ivec2(gl_FragCoord.x, h2), 0);
|
||
|
|
||
|
a_fact = clamp(abs((h1 - gl_FragCoord.y) / (h2 - h1)), 0.0, 1.0);
|
||
|
|
||
|
left_done = true;
|
||
|
}
|
||
|
if (texelFetch(tex, ivec2(gl_FragCoord.x + 1, gl_FragCoord.y), 0).a > 0) {
|
||
|
if (!left_done) {
|
||
|
h2 = get_col_height_down(gl_FragCoord.x, gl_FragCoord.y);
|
||
|
fragment = texelFetch(tex, ivec2(gl_FragCoord.x, h2), 0);
|
||
|
}
|
||
|
float h3 = get_col_height_up(gl_FragCoord.x + 1, gl_FragCoord.y);
|
||
|
|
||
|
a_fact = max(a_fact, clamp(abs((h3 - gl_FragCoord.y) / (h2 - h3)), 0.0, 1.0));
|
||
|
}
|
||
|
|
||
|
fragment.a *= a_fact;
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
}
|