precision mediump float;
varying mediump vec2 vTextureCoord;
uniform sampler2D uSampler;
uniform vec2 texelSize;
uniform float matrix[9];
void main(void)
{
vec4 c11 = texture2D(uSampler, vTextureCoord - texelSize); // top left
vec4 c12 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - texelSize.y)); // top center
vec4 c13 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y - texelSize.y)); // top right
vec4 c21 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y)); // mid left
vec4 c22 = texture2D(uSampler, vTextureCoord); // mid center
vec4 c23 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y)); // mid right
vec4 c31 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y + texelSize.y)); // bottom left
vec4 c32 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + texelSize.y)); // bottom center
vec4 c33 = texture2D(uSampler, vTextureCoord + texelSize); // bottom right
gl_FragColor =
c11 * matrix[0] + c12 * matrix[1] + c13 * matrix[2] +
c21 * matrix[3] + c22 * matrix[4] + c23 * matrix[5] +
c31 * matrix[6] + c32 * matrix[7] + c33 * matrix[8];
gl_FragColor.a = c22.a;
}