7 uniform vec2 inv_image_size;
11 // There are two common Sobel filters, horizontal and vertical
12 // (see e.g. Wikipedia, or the OpenCV documentation):
14 // [1 0 -1] [-1 -2 -1]
17 // Horizontal Vertical
19 // Note that Wikipedia and OpenCV gives entirely opposite definitions
20 // with regards to sign! This appears to be an error in the OpenCV
21 // documentation, forgetting that for convolution, the filters must be
22 // flipped. We have to flip the vertical matrix again comparing to
23 // Wikipedia, though, since we have bottom-left origin (y = up)
24 // and they define y as pointing downwards.
26 // Computing both directions at once allows us to get away with eight
27 // texture samples instead of twelve.
29 float top_left = textureOffset(tex, tc, ivec2(-1, 1)).x; // Note the bottom-left coordinate system.
30 float left = textureOffset(tex, tc, ivec2(-1, 0)).x;
31 float bottom_left = textureOffset(tex, tc, ivec2(-1, -1)).x;
33 float top = textureOffset(tex, tc, ivec2( 0, 1)).x;
34 float bottom = textureOffset(tex, tc, ivec2( 0, -1)).x;
36 float top_right = textureOffset(tex, tc, ivec2( 1, 1)).x;
37 float right = textureOffset(tex, tc, ivec2( 1, 0)).x;
38 float bottom_right = textureOffset(tex, tc, ivec2( 1, -1)).x;
40 gradients.x = (top_right + 2.0f * right + bottom_right) - (top_left + 2.0f * left + bottom_left);
41 gradients.y = (top_left + 2.0 * top + top_right) - (bottom_left + 2.0f * bottom + bottom_right);
43 // Normalize so that we have a normalized unit of intensity levels per pixel.