medianFilter5Shader top-level property

ShaderObject medianFilter5Shader
final

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;
}
"""
  ]);