medianFilter3Shader top-level property

ShaderObject medianFilter3Shader
final

Implementation

final ShaderObject medianFilter3Shader = ShaderObject("mediadnFilter3")
  ..AddUniformVars([uTexture])
  ..SetBody([
    """
#define s2(a, b)				temp = a; a = min(a, b); b = max(temp, b)
#define mn3(a, b, c)			s2(a, b); s2(a, c)
#define mx3(a, b, c)			s2(b, c); s2(a, c)
#define mnmx3(a, b, c)			mx3(a, b, c); s2(a, b)
#define mnmx4(a, b, c, d)		s2(a, b); s2(c, d); s2(a, c); s2(b, d)
#define mnmx5(a, b, c, d, e)	s2(a, b); s2(c, d); mn3(a, c, e); mx3(b, d, e)
#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)

void main() {
    vec2 c = gl_FragCoord.xy;
    vec4 temp;
    vec4 r0 = texelFetch(${uTexture}, ivec2(c + vec2(-1.0, -1.0)), 0);
    vec4 r1 = texelFetch(${uTexture}, ivec2(c + vec2(-1.0, 0.0)), 0);
    vec4 r2 = texelFetch(${uTexture}, ivec2(c + vec2(-1.0, 1.0)), 0);
    vec4 r3 = texelFetch(${uTexture}, ivec2(c + vec2(0.0, -1.0)), 0);
    vec4 r4 = texelFetch(${uTexture}, ivec2(c), 0);
    vec4 r5 = texelFetch(${uTexture}, ivec2(c + vec2(0.0, 1.0)), 0);
    vec4 r6 = texelFetch(${uTexture}, ivec2(c + vec2(1.0, -1.0)), 0);
    vec4 r7 = texelFetch(${uTexture}, ivec2(c + vec2(1.0, 0.0)), 0);
    vec4 r8 = texelFetch(${uTexture}, ivec2(c + vec2(1.0, 1.0)), 0);

    // total swaps: 20
    // sort r0 - r5
    mnmx6(r0, r1, r2, r3, r4, r5);  // 7 swaps

    // discard r0 and r5 but add r6
    mnmx5(r1, r3, r3, r4, r6);      // 6 swaps

    // discard r1 and r6 but add r7
    mnmx4(r2, r3, r4, r7);          // 4 swaps

    // discard r2 and r7 but add r8 // 3 swaps
    mnmx3(r3, r4, r8);

    ${oFragColor} = r4;
}
"""
  ]);