in vec2 position;
out vec2 flow_tc;
-out vec2 patch_bottom_left_texel; // Center of bottom-left texel of patch.
+out vec2 patch_center;
-uniform vec2 inv_flow_size, inv_image_size;
+uniform vec2 flow_size;
void main()
{
+ // Patch placement: We want the outermost patches to have centers exactly in the
+ // image corners, so that the bottom-left patch has centre (0,0) and the
+ // upper-right patch has center (1,1). The position we get in is _almost_ there;
+ // since the quad's corners are in (0,0) and (1,1), the fragment shader will get
+ // centers in x=0.5/w, x=1.5/w and so on (and similar for y).
+ //
+ // In other words, find some f(x) = ax + b so that
+ //
+ // a 0.5 / w + b = 0
+ // a (1.0 - 0.5 / w) + b = 1
+ //
+ // which gives
+ //
+ // a = 1 / (w - 1)
+ // b = w / 2 (w - 1)
+ vec2 a = flow_size / (flow_size - 1);
+ vec2 b = -1.0 / (2 * (flow_size - 1.0));
+ patch_center = a * position + b;
+
// The result of glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0) is:
//
// 2.000 0.000 0.000 -1.000
// 0.000 0.000 0.000 1.000
gl_Position = vec4(2.0 * position.x - 1.0, 2.0 * position.y - 1.0, -1.0, 1.0);
flow_tc = position;
-
- vec2 patch_bottom_left = position - vec2(0.5, 0.5) * inv_flow_size;
- patch_bottom_left_texel = patch_bottom_left + vec2(0.5, 0.5) * inv_image_size;
}