glBindTextureUnit(0, tex0_view);
glBindSampler(0, nearest_sampler);
glProgramUniform1i(sobel_program, glGetUniformLocation(sobel_program, "tex"), 0);
- glProgramUniform1f(sobel_program, glGetUniformLocation(sobel_program, "inv_width"), 1.0f / level_width);
- glProgramUniform1f(sobel_program, glGetUniformLocation(sobel_program, "inv_height"), 1.0f / level_height);
+ glProgramUniform2f(sobel_program, glGetUniformLocation(sobel_program, "image_size"), level_width, level_height);
+ glProgramUniform2f(sobel_program, glGetUniformLocation(sobel_program, "inv_image_size"), 1.0f / level_width, 1.0f / level_height);
GLuint grad0_fbo; // TODO: cleanup
glCreateFramebuffers(1, &grad0_fbo);
bind_sampler(motion_search_program, "grad0_tex", 2, grad0_tex, nearest_sampler);
bind_sampler(motion_search_program, "flow_tex", 3, flow_tex, linear_sampler);
- glProgramUniform1f(motion_search_program, glGetUniformLocation(motion_search_program, "image_width"), level_width);
- glProgramUniform1f(motion_search_program, glGetUniformLocation(motion_search_program, "image_height"), level_height);
- glProgramUniform1f(motion_search_program, glGetUniformLocation(motion_search_program, "inv_image_width"), 1.0f / level_width);
- glProgramUniform1f(motion_search_program, glGetUniformLocation(motion_search_program, "inv_image_height"), 1.0f / level_height);
+ glProgramUniform2f(motion_search_program, glGetUniformLocation(motion_search_program, "image_size"), level_width, level_height);
+ glProgramUniform2f(motion_search_program, glGetUniformLocation(motion_search_program, "inv_image_size"), 1.0f / level_width, 1.0f / level_height);
GLuint flow_fbo; // TODO: cleanup
glCreateFramebuffers(1, &flow_fbo);
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
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;
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;
}
out vec2 gradients;
uniform sampler2D tex;
-uniform float inv_width, inv_height;
+uniform vec2 inv_image_size;
void main()
{
// Computing both at once allows us to get away with eight
// texture samples instead of twelve.
- float x_left = tc.x - inv_width;
+ float x_left = tc.x - inv_image_size.x;
float x_mid = tc.x;
- float x_right = tc.x + inv_width;
+ float x_right = tc.x + inv_image_size.x;
- float y_top = tc.y + inv_height; // Note the bottom-left coordinate system.
+ float y_top = tc.y + inv_image_size.y; // Note the bottom-left coordinate system.
float y_mid = tc.y;
- float y_bottom = tc.y - inv_height;
+ float y_bottom = tc.y - inv_image_size.y;
float top_left = texture(tex, vec2(x_left, y_top)).x;
float left = texture(tex, vec2(x_left, y_mid)).x;