#version 150 in vec2 vertTexCoord; in vec4 vertColor; uniform sampler2D colorTexture; uniform float time; uniform float spacing; uniform float colorMultiplier; out vec4 fragColor; const float ALPHA_THRESHOLD = 0.03125; float sampleAlpha(ivec2 offset, float deltaX, float deltaY) { return texture(colorTexture, vertTexCoord + vec2(offset) * vec2(deltaX, deltaY)).a; } void main() { float deltaX = fwidth(vertTexCoord.x) * 1.5; float deltaY = fwidth(vertTexCoord.y) * 1.5; float alphaCenter = sampleAlpha(ivec2(0, 0), deltaX, deltaY); float alphaLeft = sampleAlpha(ivec2(-1, 0), deltaX, deltaY); float alphaRight = sampleAlpha(ivec2(1, 0), deltaX, deltaY); float alphaDown = sampleAlpha(ivec2(0, -1), deltaX, deltaY); float alphaUp = sampleAlpha(ivec2(0, 1), deltaX, deltaY); float adjacentMin = min(min(min(alphaLeft, alphaRight), alphaDown), alphaUp); float alphaLeftFar = sampleAlpha(ivec2(-2, 0), deltaX, deltaY); float alphaRightFar = sampleAlpha(ivec2(2, 0), deltaX, deltaY); float alphaDownFar = sampleAlpha(ivec2(0, -2), deltaX, deltaY); float alphaUpFar = sampleAlpha(ivec2(0, 2), deltaX, deltaY); float adjacentMinFar = min(min(min(alphaLeftFar, alphaRightFar), alphaDownFar), alphaUpFar); float outputAlpha = 1.0 - (step(ALPHA_THRESHOLD, min(min(adjacentMinFar, adjacentMin), alphaCenter)) + 1.0 - step(ALPHA_THRESHOLD, max(max(adjacentMinFar, adjacentMin), alphaCenter))); float outputLuminance = step(0.5, mod(vertTexCoord.y / deltaY * -1.0 + time * 2 * spacing, spacing) / spacing); fragColor = vec4(mix(vertColor, vertColor * vec4(colorMultiplier, colorMultiplier, colorMultiplier, 1.0), outputLuminance)) * outputAlpha; }