есть шейдеры
// vertex
attribute vec4 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main(void) {
gl_Position = a_position;
v_texCoord = a_texCoord;
}
// fragment
varying vec2 v_texCoord;
uniform sampler2D u_texture;
uniform int winRad;
uniform float ml;
uniform float width;
void main()
{
vec4 tc = texture2D(u_texture, v_texCoord);
for (int i=1; i<winRad; i++)
{
float shift = float(i) / width;
tc += texture2D(u_texture, v_texCoord + vec2(shift,0.0));
tc += texture2D(u_texture, v_texCoord - vec2(shift,0.0));
}
tc = tc * ml;
gl_FragColor = tc;
}
например
glUniform1i(glGetUniformLocation(prg,"u_texture"), 0);