#version 150 in vec2 texCoord; out vec4 fragColor; uniform float spacing; uniform float threshold; uniform float time; uniform vec2 cellSize; uniform vec4 borderColor1; uniform vec4 borderColor2; uniform float centerSampleMix; uniform sampler2D selection; float sampleSelection(float xOffset, float yOffset) { return step(threshold, texture(selection, vec2(texCoord.x + xOffset / cellSize.x, texCoord.y + yOffset / cellSize.y)).r); } float isEdge(float leftSample, float rightSample, float belowSample, float aboveSample, float centerSample) { return centerSample * (1.0 - min(leftSample, min(rightSample, min(belowSample, aboveSample)))); } void main() { float leftSample = sampleSelection(-1, 0); float rightSample = sampleSelection(1, 0); float belowSample = sampleSelection(0, -1); float aboveSample = sampleSelection(0, 1); float centerSample = sampleSelection(0, 0); float selectionMix = isEdge(leftSample, rightSample, belowSample, aboveSample, centerSample); selectionMix = max(selectionMix, centerSample * centerSampleMix); float borderLuminance = step(0.5, mod(gl_FragCoord.x + gl_FragCoord.y + time * 2 * spacing, spacing) / spacing); fragColor = vec4(mix(borderColor1, borderColor2, borderLuminance)) * selectionMix; }