From a75370343264a46e8addeff4973c7267e8ff2146 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 4 Jul 2018 09:26:55 +0200 Subject: [PATCH] Make image width/height consistently a vec2. --- flow.cpp | 10 ++++------ motion_search.frag | 18 +++++++----------- sobel.frag | 10 +++++----- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/flow.cpp b/flow.cpp index dba6607..8e823e7 100644 --- a/flow.cpp +++ b/flow.cpp @@ -248,8 +248,8 @@ void Sobel::exec(GLint tex0_view, GLint grad0_tex, int level_width, int level_he 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); @@ -305,10 +305,8 @@ void MotionSearch::exec(GLuint tex0_view, GLuint tex1_view, GLuint grad0_tex, GL 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); 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; } diff --git a/sobel.frag b/sobel.frag index e6b377f..4fd12a3 100644 --- a/sobel.frag +++ b/sobel.frag @@ -4,7 +4,7 @@ in vec2 tc; out vec2 gradients; uniform sampler2D tex; -uniform float inv_width, inv_height; +uniform vec2 inv_image_size; void main() { @@ -19,13 +19,13 @@ 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; -- 2.39.2