precision mediump float; varying vec2 vTextureCoord; uniform vec2 size; uniform sampler2D uSampler; uniform vec4 filterArea; vec2 mapCoord( vec2 coord ) { coord *= filterArea.xy; coord += filterArea.zw; return coord; } vec2 unmapCoord( vec2 coord ) { coord -= filterArea.zw; coord /= filterArea.xy; return coord; } vec2 pixelate(vec2 coord, vec2 size) { return floor( coord / size ) * size; } void main(void) { vec2 coord = mapCoord(vTextureCoord); coord = pixelate(coord, size); coord = unmapCoord(coord); gl_FragColor = texture2D(uSampler, coord); }