precision mediump float; uniform sampler2D texture; uniform float alpha; uniform vec2 texAtlasSize; uniform float texAtlasIndex; const float clampBorder = 0.005; varying vec2 pass_TexCoords; vec2 getTexCoordsInAtlas(in vec2 clampedTexCoords, in float atlasIndex); void main() { vec2 clampedTexCoords = pass_TexCoords; if(texAtlasSize.x > 1.0 || texAtlasSize.y > 1.0) clampedTexCoords = clamp(pass_TexCoords, clampBorder, 1.0 - clampBorder); vec2 texAtlasCoords = getTexCoordsInAtlas(clampedTexCoords, texAtlasIndex); gl_FragColor = texture2D(texture, texAtlasCoords); gl_FragColor.a = min(gl_FragColor.a, alpha); gl_FragColor.rgb = gl_FragColor.rgb / gl_FragColor.a; } vec2 getTexCoordsInAtlas(in vec2 clampedTexCoords, in float atlasIndex){ vec2 texAtlasCoords = vec2(0.0, 0.0); texAtlasCoords.x = mod(clampedTexCoords.x, 1.0) / texAtlasSize.x; texAtlasCoords.x += mod(atlasIndex, texAtlasSize.x) / texAtlasSize.x; texAtlasCoords.y = mod(clampedTexCoords.y, 1.0) / texAtlasSize.y; texAtlasCoords.y += floor(atlasIndex / texAtlasSize.y) / texAtlasSize.y; return texAtlasCoords; }