{
  "name": "Remote shader",
  "id": "remote-shader",
  "module": {
    "kind": "shader",
    "id": "remote-shader",
    "name": "Remote Shader",
    "inputs": [{ "id": "in", "label": "In", "type": "frame" }],
    "outputs": [{ "id": "out", "label": "Out", "type": "frame" }],
    "params": [],
    "fragmentSrc": `#version 300 es
precision mediump float;

in vec2 v_texCoord;
uniform sampler2D u_texture;
uniform vec2 u_resolution;
out vec4 fragColor;

float luma(vec2 uv) {
  return dot(texture(u_texture, uv).rgb, vec3(0.299, 0.587, 0.114));
}

void main() {
  vec2 p = 1.0 / u_resolution;

  float tl = luma(v_texCoord + vec2(-p.x, -p.y));
  float tc = luma(v_texCoord + vec2( 0.0, -p.y));
  float tr = luma(v_texCoord + vec2( p.x, -p.y));
  float ml = luma(v_texCoord + vec2(-p.x,  0.0));
  float mr = luma(v_texCoord + vec2( p.x,  0.0));
  float bl = luma(v_texCoord + vec2(-p.x,  p.y));
  float bc = luma(v_texCoord + vec2( 0.0,  p.y));
  float br = luma(v_texCoord + vec2( p.x,  p.y));

  float gx = -tl - 2.0*ml - bl + tr + 2.0*mr + br;
  float gy = -tl - 2.0*tc - tr + bl + 2.0*bc + br;
  float edge = sqrt(gx*gx + gy*gy);

  fragColor = vec4(vec3(edge), 1.0);
}`
  }
}
