The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
%% $language
GLSL
%% $fragment
// numTiles resp. stride, dotsize als Parameter

// #version 120

uniform sampler2D Source;
varying vec2 texCoord;

const float steps = 2.0;
const float dotsize = 1.0 / steps ;
const float half_step = dotsize / 2.0;

// This should be a static 2x2 pixel texture
// but it's done as an if statement instead ...

/*
mat4x4 tint = mat4(
                 vec4(1.0,0.0,1.0,0.0),
                 vec4(1.0,0.0,1.0,0.0),
                 vec4(1.0,0.0,1.0,0.0),
                 vec4(1.0,0.0,1.0,0.0)
                );
*/

void main(void)
{
    vec2 img    = texCoord * steps;
    vec4 pel    = texture2D( Source, img );
    
    vec4 tint;
    
    // Magenta Blue
    // Cyan    Yellow
    int ofs = int(texCoord.x*steps) + int(texCoord.y*steps)*2;
    if    (0 == ofs) {
        tint = vec4(1.0,1.0,0.0,0.0);
    } else if (1 == ofs) {
        tint = vec4(0.0,0.0,1.0,0.0);
    } else if (2 == ofs) {
        tint = vec4(1.0,0.0,1.0,0.0);
    } else { // (3 == ofs)
        tint = vec4(0.0,1.0,1.0,0.0);
    };
    
    float gray  = dot(pel.rgb,
                      vec3(0.3, 0.59, 0.11));
    gl_FragColor = mix( pel, tint, gray );
}

%% $vertex
varying vec2  texCoord;

void main(void)
{
   gl_Position = vec4( gl_Vertex.xy, 0.0, 1.0 );
   gl_Position = sign( gl_Position );

   // Texture coordinate for screen aligned (in correct range):
   texCoord = (vec2( gl_Position.x, + gl_Position.y ) + vec2( 1.0 ) ) / vec2( 2.0 );

}