0.00
60.0 fps

Atari ST Inspired

was meant to be something else

Log in to post a comment.

#version 300 es
precision highp float;

uniform float iTime;
uniform vec2  iResolution;

out vec4 fragColor;

vec3 palette(float t) {
    t = fract(t);
    return 0.5 + 0.5 * cos(6.28318 * (vec3(0.0, 0.33, 0.67) + t));
}

void main() {
    vec2 frag = gl_FragCoord.xy;

    // ----------------------------------------------------------
    // 1. SCREEN-SPACE BARREL / CRT WARP
    // ----------------------------------------------------------
    vec2 uv = (frag / iResolution) * 2.0 - 1.0;
    float r2 = dot(uv, uv);
    float barrel = 1.0 + 0.15 * r2;
    uv *= barrel;

    frag = (uv * 0.5 + 0.5) * iResolution;

    frag = clamp(frag, vec2(0.0), iResolution - 1.0);

    // ----------------------------------------------------------
    // 2. WAVES + COLUMN WOBBLE + SCANLINE SHIMMER
    // ----------------------------------------------------------
    float waveAmp  = 40.0;
    float waveFreq = 0.063;
    float waveSpd  = 3.0;

    float w =
        sin(frag.y * waveFreq + iTime * waveSpd) +
        cos(frag.x * waveFreq * 0.8 + iTime * waveSpd * 1.4);

    float colWobble = sin(frag.x * 0.15 + iTime * 5.0) * 5.0;
    float scanWave  = sin(frag.y * 0.25 + iTime * 6.0) * 4.0;

    frag.x += w * waveAmp + colWobble;
    frag.y += w * waveAmp * 0.4 + scanWave;

    frag = clamp(frag, vec2(0.0), iResolution - 1.0);

    // ----------------------------------------------------------
    // 3. ROW / COLUMN INDEXING (BUT NO BUILD-UP)
    // ----------------------------------------------------------
    float columnWidth = 16.0;
    float rows = floor(iResolution.y);
    float cols = floor(iResolution.x / columnWidth);

    float col = clamp(floor(frag.x / columnWidth), 0.0, cols - 1.0);
    float row = floor(iResolution.y - frag.y - 1.0);
    row = clamp(row, 0.0, rows - 1.0);

    // NO MORE SLOW FILL — FULL VISIBILITY
    float visible = 1.0;

    // ----------------------------------------------------------
    // 4. RAINBOW COLOR
    // ----------------------------------------------------------
    float timeSpeed   = 0.1;
    float lineSpacing = 1.0 / 64.0;

    float basePhase = row * lineSpacing;
    float t = basePhase + iTime * timeSpeed + col * 0.02;

    fragColor = vec4(palette(t) * visible, 1.0);
}