package com.marshalchen.common.uimodule.imageprocessing.filter.processing; import com.marshalchen.common.uimodule.imageprocessing.filter.MultiPixelRenderer; /** * Takes the median value of the three color components, over a 3x3 area * @author Chris Batt */ public class MedianFilter extends MultiPixelRenderer { @Override protected String getFragmentShader() { return "precision mediump float;\n" +"uniform sampler2D "+UNIFORM_TEXTURE0+";\n" +"varying vec2 "+VARYING_TEXCOORD+";\n" +"uniform float "+UNIFORM_TEXELWIDTH+";\n" +"uniform float "+UNIFORM_TEXELHEIGHT+";\n" +"#define s2(a, b) temp = a; a = min(a, b); b = max(temp, b);\n" +"#define mn3(a, b, c) s2(a, b); s2(a, c);\n" +"#define mx3(a, b, c) s2(b, c); s2(a, c);\n" +"#define mnmx3(a, b, c) mx3(a, b, c); s2(a, b);\n" +"#define mnmx4(a, b, c, d) s2(a, b); s2(c, d); s2(a, c); s2(b, d);\n" +"#define mnmx5(a, b, c, d, e) s2(a, b); s2(c, d); mn3(a, c, e); mx3(b, d, e);\n" +"#define mnmx6(a, b, c, d, e, f) s2(a, d); s2(b, e); s2(c, f); mn3(a, b, c); mx3(d, e, f);\n" +"void main() {\n" +" vec3 v[6];\n" +" vec2 right = vec2(0.0, "+UNIFORM_TEXELWIDTH+");\n" +" vec2 down = vec2(0.0, "+UNIFORM_TEXELHEIGHT+");\n" +" v[0] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - down - right).rgb;\n" +" v[1] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - down).rgb;\n" +" v[2] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - down + right).rgb;\n" +" v[3] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - right).rgb;\n" +" v[4] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+").rgb;\n" +" v[5] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + right).rgb;\n" +" vec3 temp;\n" +" mnmx6(v[0], v[1], v[2], v[3], v[4], v[5]);\n" +" v[5] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + down - right).rgb;\n" +" mnmx5(v[1], v[2], v[3], v[4], v[5]);\n" +" v[5] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + down).rgb;\n" +" mnmx4(v[2], v[3], v[4], v[5]);\n" +" v[5] = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + down + right).rgb;\n" +" mnmx3(v[3], v[4], v[5]);\n" +" gl_FragColor = vec4(v[4], 1.0);\n" +"}\n"; } }