#if defined(OPENGL_ES) || defined(GL_ES)
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#endif

///////////////////////////////////////////////////////////
// Uniforms
uniform sampler2D u_texture;
uniform float u_width;
uniform float u_height;

///////////////////////////////////////////////////////////
// Varyings
varying vec2 v_texCoord;
varying vec4 v_color;


void main()
{
      float w = u_width;
      float h = u_height;
     
      vec4 n[9];
      n[0] = texture2D(u_texture, v_texCoord + vec2( -w, -h));
      n[1] = texture2D(u_texture, v_texCoord + vec2(0.0, -h)) * 2.0;
      n[2] = texture2D(u_texture, v_texCoord + vec2(  w, -h));
      n[3] = texture2D(u_texture, v_texCoord + vec2( -w, 0.0)) * 2.0;
      n[4] = texture2D(u_texture, v_texCoord);
      n[5] = texture2D(u_texture, v_texCoord + vec2(  w, 0.0)) * 2.0;
      n[6] = texture2D(u_texture, v_texCoord + vec2( -w, h));
      n[7] = texture2D(u_texture, v_texCoord + vec2(0.0, h)) * 2.0;
      n[8] = texture2D(u_texture, v_texCoord + vec2(  w, h));
      
      // Sobel Edge
      vec4 sobel_horizEdge = n[2] + n[5] + n[8];
      vec4 sobel_vertEdge  = n[0] + n[1] + n[2];
      sobel_horizEdge -= (n[0] + n[3] + n[6]);
      sobel_vertEdge -= (n[6] + n[7] + n[8]);
      vec3 sobel = sqrt((sobel_horizEdge.rgb * sobel_horizEdge.rgb) + (sobel_vertEdge.rgb * sobel_vertEdge.rgb));
      
      gl_FragColor = vec4( sobel, 1.0 );
}

