{
  "name": "Washed Out",
  "type": "static",
  "passes": [
    {
      "name": "washed out",
      "inputs": [
        "default"
      ],
      "glsl": "precision highp float;

               varying vec2 sourceTextureCoordinate;

               uniform vec2 outputSize; // size of the output fbo


               vec4 sharpen(vec2 uv){
                 vec2 d = 1.25 / outputSize;
                 vec4 c = sampleInput(uv) * 5.0;
                 c -= sampleInput(uv + vec2(d.x, 0.0));
                 c -= sampleInput(uv + vec2(-d.x, 0.0));
                 c -= sampleInput(uv + vec2(0.0,d.y));
                 c -= sampleInput(uv + vec2(0.0,-d.y));
                 return c;
               }

               vec3 colorCorrect(vec3 col){
                 col *= 2.0;
                 col -= 0.2;
                 col.rb += 0.045;
                 col = clamp(col, 0.0, 0.9);
                 col += 0.025;
                 col = pow(col, vec3(0.8));
                 col /= 1.25;
                 return col;
               }

               // effect uniforms
               void main() {

                 vec2 uv = sourceTextureCoordinate;

                 vec4 s = sharpen(uv);
                 vec3 cc = colorCorrect(s.rgb);

                 vec4 color = vec4(cc, 1.0);
                 gl_FragColor = toOutputFormat(color);
               }
",
      "metal": "using namespace metal;
struct fragmentIn { float2 textureCoordinate [[user(locn0)]]; float2 sourceTextureCoordinate [[user(locn1)]]; };
struct fragmentOut { float4 _gl_FragColor [[color(0)]]; };
typedef struct {
  float4x4 content_transform;
  float4x4 texture_transform;
  float strength;
  float progress;
  float time_sec;
  float duration_sec;
  float clip_duration_sec;
  float2 input_size;
  float2 output_size;
  float2 tex0Size;
 } Uniforms;
float4 sharpen(float2 uv, DefaultInputs defaultInputs, constant Uniforms & uniforms){
  float2 d = 1.25 / uniforms.output_size;
  float4 c = sampleInput(defaultInputs, uv) * 5.0;
  c -= sampleInput(defaultInputs, uv + float2(d.x, 0.0));
  c -= sampleInput(defaultInputs, uv + float2(-d.x, 0.0));
  c -= sampleInput(defaultInputs, uv + float2(0.0,d.y));
  c -= sampleInput(defaultInputs, uv + float2(0.0,-d.y));
  return c;
}

float3 colorCorrect(float3 col){
  col *= 2.0;
  col -= 0.2;
  col.rb += 0.045;
  col = clamp(col, 0.0, 0.9);
  col += 0.025;
  col = pow(col, float3(0.8));
  col /= 1.25;
  return col;
}

// effect uniforms
fragment fragmentOut fragmentShader(fragmentIn in [[stage_in]],
 constant Uniforms & uniforms [[buffer(1)]],
 DefaultInputs defaultInputs) {

  float2 uv = in.sourceTextureCoordinate;

  float4 s = sharpen(uv, defaultInputs, uniforms);
  float3 cc = colorCorrect(s.rgb);

  float4 color = float4(cc, 1.0);
  return {toOutputFormat(color)};
}
",
      "uniforms": {}
    }
  ]
}
