All pastes #737862 Raw Edit

Stuff

public text v1 · immutable
·published 2007-10-15 19:58 UTC
rendered paste body
// comic shader attempt :D

uniform sampler2D image;
uniform ivec2 gridsize;
uniform float blackness;
varying vec2  TexCoord0;

#define isEven(x) (int(x / 2.0) == x / 2.0)

void main (void)
{   
    const vec2 cyan    = vec2(0, 0.3 / gridsize.y), 
               yellow  = vec2(-0.3 / gridsize.x, -0.3 / gridsize.y), 
               magenta = vec2(0.3 / gridsize.x, -0.3 / gridsize.y);
    
    
    float gridlen = 2.0 / length(vec2(gridsize));
    
    vec2 gridpos;
    gridpos.y = floor(TexCoord0.y * float(gridsize.y));
    gridpos.x = floor(TexCoord0.x * float(gridsize.x));
    vec2 bgPos = gridpos / gridsize;
    bgPos.y += (0.5 / gridsize.y);
    if (isEven(gridpos.y))
    {
       gridpos.x = floor((TexCoord0.x + 0.5 / gridsize.x ) * float(gridsize.x));
       bgPos.x = gridpos.x / gridsize.x;
    }
    else
    {
       bgPos.x = gridpos.x / gridsize.x + (0.5 / gridsize.x);
    }
    
    vec4 backCol = texture2D(image, bgPos, -10.0).rgba;
    vec4 posCol  = texture2D(image, TexCoord0).rgba;
    
    float lum = (posCol.r + posCol.g + posCol.b) / 3.0;
    float variance = (abs(posCol.r -lum) + abs(posCol.g -lum) + abs(posCol.b - lum)) / 3.0;
    
    if ( lum < blackness && variance < blackness)
    {
       gl_FragColor = vec4(0,0,0,1);
    }
    else
    {
       vec4 newCol;
       
       // get cyan (inverse red)
       newCol.r = (distance(TexCoord0, bgPos + cyan) > gridlen * (1.0-backCol.r) ) ? 1.0 : 0.0;
       // magenta (inverse green)
       newCol.g = (distance(TexCoord0, bgPos + magenta) > gridlen * (1.0-backCol.g) ) ? 1.0 : 0.0;
       // yellow (inverse blue)
       newCol.b = (distance(TexCoord0, bgPos + yellow) > gridlen * (1.0-backCol.b) ) ? 1.0 : 0.0;
       
       newCol.a = backCol.a;
       
      //if (dFdx() > 1.0)
          gl_FragColor = newCol;
      // else
        //  gl_FragColor = backCol;
       
    }
    
    
    return;
}