#version 300 es precision mediump float; in vec2 texCoord; uniform sampler2D colorTexture; uniform float texelsPerFragment; out vec4 fragColor; void main() { vec2 contributingTexCoords[2]; float weightX, weightY; float halfTexelsPerFragment; float weights[4]; halfTexelsPerFragment = texelsPerFragment * 0.5; contributingTexCoords[0] = vec2(texCoord.x - halfTexelsPerFragment, texCoord.y - halfTexelsPerFragment); contributingTexCoords[1] = vec2(texCoord.x + halfTexelsPerFragment, texCoord.y + halfTexelsPerFragment); weightX = min(1.0, (ceil(contributingTexCoords[0].x) - contributingTexCoords[0].x) / texelsPerFragment); weightY = min(1.0, (ceil(contributingTexCoords[0].y) - contributingTexCoords[0].y) / texelsPerFragment); weights[0] = weightX * weightY; weights[1] = (1.0 - weightX) * weightY; weights[2] = weightX * (1.0 - weightY); weights[3] = (1.0 - weightX) * (1.0 - weightY); fragColor = vec4(0.0, 0.0, 0.0, 0.0); for (int indexY = 0; indexY < 2; indexY++) { for (int indexX = 0; indexX < 2; indexX++) { fragColor += texelFetch(colorTexture, ivec2(contributingTexCoords[indexX].x, contributingTexCoords[indexY].y), 0) * weights[indexY * 2 + indexX]; } } }