// 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; }