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; }