36 lines
1.2 KiB
GLSL
36 lines
1.2 KiB
GLSL
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;
|
|
|
|
} |