Implementation
final ShaderObject medianFilter5Shader = ShaderObject("mediadnFilter5")
..AddUniformVars([uTexture])
..SetBody([
"""
#define s2(a, b) temp = a; a = min(a, b); b = max(temp, b)
#define t24(a, b, c, d, e, f, g, h) s2(a, b); s2(c, d); s2(e, f); s2(g, h)
#define t25(a, b, c, d, e, f, g, h, i, j) t24(a, b, c, d, e, f, g, h); s2(i, j)
void main() {
vec2 c = gl_FragCoord.xy;
vec4 temp;
vec4 r00 = texelFetch(${uTexture}, ivec2(c + vec2(-2.0, -2.0)), 0);
vec4 r01 = texelFetch(${uTexture}, ivec2(c + vec2(-2.0, -1.0)), 0);
vec4 r02 = texelFetch(${uTexture}, ivec2(c + vec2(-2.0, 0.0)), 0);
vec4 r03 = texelFetch(${uTexture}, ivec2(c + vec2(-2.0, 1.0)), 0);
vec4 r04 = texelFetch(${uTexture}, ivec2(c + vec2(-2.0, 2.0)), 0);
vec4 r05 = texelFetch(${uTexture}, ivec2(c + vec2(-1.0, -2.0)), 0);
vec4 r06 = texelFetch(${uTexture}, ivec2(c + vec2(-1.0, -1.0)), 0);
vec4 r07 = texelFetch(${uTexture}, ivec2(c + vec2(-1.0, 0.0)), 0);
vec4 r08 = texelFetch(${uTexture}, ivec2(c + vec2(-1.0, 1.0)), 0);
vec4 r09 = texelFetch(${uTexture}, ivec2(c + vec2(-1.0, 2.0)), 0);
vec4 r10 = texelFetch(${uTexture}, ivec2(c + vec2(0.0, -2.0)), 0);
vec4 r11 = texelFetch(${uTexture}, ivec2(c + vec2(0.0, -1.0)), 0);
vec4 r12 = texelFetch(${uTexture}, ivec2(c + vec2(0.0, 0.0)), 0);
vec4 r13 = texelFetch(${uTexture}, ivec2(c + vec2(0.0, 1.0)), 0);
vec4 r14 = texelFetch(${uTexture}, ivec2(c + vec2(0.0, 2.0)), 0);
vec4 r15 = texelFetch(${uTexture}, ivec2(c + vec2(1.0, -2.0)), 0);
vec4 r16 = texelFetch(${uTexture}, ivec2(c + vec2(1.0, -1.0)), 0);
vec4 r17 = texelFetch(${uTexture}, ivec2(c + vec2(1.0, 0.0)), 0);
vec4 r18 = texelFetch(${uTexture}, ivec2(c + vec2(1.0, 1.0)), 0);
vec4 r19 = texelFetch(${uTexture}, ivec2(c + vec2(1.0, 2.0)), 0);
vec4 r20 = texelFetch(${uTexture}, ivec2(c + vec2(2.0, -2.0)), 0);
vec4 r21 = texelFetch(${uTexture}, ivec2(c + vec2(2.0, -1.0)), 0);
vec4 r22 = texelFetch(${uTexture}, ivec2(c + vec2(2.0, 0.0)), 0);
vec4 r23 = texelFetch(${uTexture}, ivec2(c + vec2(2.0, 1.0)), 0);
vec4 r24 = texelFetch(${uTexture}, ivec2(c + vec2(2.0, 2.0)), 0);
t25(r00, r01, r03, r04, r02, r04, r02, r03, r06, r07);
t25(r05, r07, r05, r06, r09, r07, r01, r07, r01, r04);
t25(r12, r13, r11, r13, r11, r12, r15, r16, r14, r16);
t25(r14, r15, r18, r19, r17, r19, r17, r18, r21, r22);
t25(r20, r22, r20, r21, r23, r24, r02, r05, r03, r06);
t25(r00, r06, r00, r03, r04, r07, r01, r07, r01, r04);
t25(r11, r14, r08, r14, r08, r11, r12, r15, r09, r15);
t25(r09, r12, r13, r16, r10, r16, r10, r13, r20, r23);
t25(r17, r23, r17, r20, r21, r24, r18, r24, r18, r21);
t25(r19, r22, r08, r17, r09, r18, r00, r18, r00, r09);
t25(r10, r19, r01, r19, r01, r10, r11, r20, r02, r20);
t25(r02, r11, r12, r21, r03, r21, r03, r12, r13, r22);
t25(r04, r22, r04, r13, r14, r23, r05, r23, r05, r14);
t25(r15, r24, r06, r24, r06, r15, r07, r16, r07, r19);
t25(r03, r11, r05, r17, r11, r17, r09, r17, r04, r10);
t25(r06, r12, r07, r14, r04, r06, r04, r07, r12, r14);
t25(r10, r14, r06, r07, r10, r12, r06, r10, r06, r17);
t25(r12, r17, r07, r17, r07, r10, r12, r18, r07, r12);
t24(r10, r18, r12, r20, r10, r20, r10, r12);
${oFragColor} = r12;
}
"""
]);