X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=motion_search.frag;h=5f2b6f8c2e1c79ffaee0de5b9c04ace4153b0f1d;hb=a75370343264a46e8addeff4973c7267e8ff2146;hp=e31a673484be9479f71a7428feec4348604bbf5d;hpb=bcdff7b1a183d7ff138a920997182d00f2decf0e;p=nageru diff --git a/motion_search.frag b/motion_search.frag index e31a673..5f2b6f8 100644 --- a/motion_search.frag +++ b/motion_search.frag @@ -43,14 +43,14 @@ in vec2 patch_bottom_left_texel; // Center of bottom-left texel of patch. out vec2 out_flow; uniform sampler2D flow_tex, grad0_tex, image0_tex, image1_tex; -uniform float image_width, image_height, inv_image_width, inv_image_height; +uniform vec2 image_size, inv_image_size; void main() { // Lock patch_bottom_left_texel to an integer, so that we never get // any bilinear artifacts for the gradient. - vec2 base = round(patch_bottom_left_texel * vec2(image_width, image_height)) - * vec2(inv_image_width, inv_image_height); + vec2 base = round(patch_bottom_left_texel * image_size) + * inv_image_size; // First, precompute the pseudo-Hessian for the template patch. // This is the part where we really save by the inverse search @@ -65,9 +65,7 @@ void main() mat2 H = mat2(0.0f); for (uint y = 0; y < patch_size; ++y) { for (uint x = 0; x < patch_size; ++x) { - vec2 tc; - tc.x = base.x + x * inv_image_width; - tc.y = base.y + y * inv_image_height; + vec2 tc = base + uvec2(x, y) * inv_image_size; vec2 grad = texture(grad0_tex, tc).xy; H[0][0] += grad.x * grad.x; H[1][1] += grad.y * grad.y; @@ -103,20 +101,18 @@ void main() vec2 du = vec2(0.0, 0.0); for (uint y = 0; y < patch_size; ++y) { for (uint x = 0; x < patch_size; ++x) { - vec2 tc; - tc.x = base.x + x * inv_image_width; - tc.y = base.y + y * inv_image_height; + vec2 tc = base + uvec2(x, y) * inv_image_size; vec2 grad = texture(grad0_tex, tc).xy; float t = texture(image0_tex, tc).x; float warped = texture(image1_tex, tc + u).x; du += grad * (warped - t); } } - u += (H_inv * du) * vec2(inv_image_width, inv_image_height); + u += (H_inv * du) * inv_image_size; } // Reject if we moved too far. - if (length((u - initial_u) * vec2(image_width, image_height)) > patch_size) { + if (length((u - initial_u) * image_size) > patch_size) { u = initial_u; }