X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=densify.vert;h=181c7f32b72203ed16244253097e0223fe4493c2;hb=3795723be95f2fe82f3c8b8b45b1a905b2c811fd;hp=e4db8fba94789e57145d7da20f1ccae455342290;hpb=957d873c387993c711249657f3080c5d686d7ea1;p=nageru diff --git a/densify.vert b/densify.vert index e4db8fb..181c7f3 100644 --- a/densify.vert +++ b/densify.vert @@ -1,25 +1,44 @@ #version 450 core +#extension GL_ARB_shader_viewport_layer_array : require -in vec2 position; +layout(location=0) in vec2 position; out vec2 image_pos; flat out vec2 flow_du; +flat out float mean_diff; +flat out int image0_layer, image1_layer; -uniform int width_patches; uniform vec2 patch_size; // In 0..1 coordinates. -uniform vec2 patch_spacing; // In 0..1 coordinates. -uniform sampler2D flow_tex; +uniform sampler2DArray flow_tex; void main() { - int patch_x = gl_InstanceID % width_patches; - int patch_y = gl_InstanceID / width_patches; + int num_patches = textureSize(flow_tex, 0).x * textureSize(flow_tex, 0).y; + int patch_layer = gl_InstanceID / num_patches; + int patch_x = gl_InstanceID % textureSize(flow_tex, 0).x; + int patch_y = (gl_InstanceID % num_patches) / textureSize(flow_tex, 0).x; - // TODO: Lock the bottom left of the patch to an integer number of pixels? + // Convert the patch index to being the full 0..1 range, to match where + // the motion search puts the patches. We don't bother with the locking + // to texel centers, though. + vec2 patch_center = ivec2(patch_x, patch_y) / (textureSize(flow_tex, 0).xy - 1.0); - image_pos = patch_spacing * ivec2(patch_x, patch_y) + patch_size * position; + // Increase the patch size a bit; since patch spacing is not necessarily + // an integer number of pixels, and we don't use conservative rasterization, + // we could be missing the outer edges of the patch. And it seemingly helps + // a little bit in general to have some more candidates as well -- although + // this is measured without variational refinement, so it might be moot + // with it. + // + // This maps [0.0,1.0] to [-0.25,1.25], ie. extends the patch by 25% in + // all directions. + vec2 grown_pos = (position * 1.5) - 0.25; + + image_pos = patch_center + patch_size * (grown_pos - 0.5f); // Find the flow value for this patch, and send it on to the fragment shader. - flow_du = texelFetch(flow_tex, ivec2(patch_x, patch_y), 0).xy; + vec3 flow_du_and_mean_diff = texelFetch(flow_tex, ivec3(patch_x, patch_y, patch_layer), 0).xyz; + flow_du = flow_du_and_mean_diff.xy; + mean_diff = flow_du_and_mean_diff.z; // The result of glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0) is: // @@ -28,4 +47,9 @@ void main() // 0.000 0.000 -2.000 -1.000 // 0.000 0.000 0.000 1.000 gl_Position = vec4(2.0 * image_pos.x - 1.0, 2.0 * image_pos.y - 1.0, -1.0, 1.0); + gl_Layer = patch_layer; + + // Forward flow (0) goes from 0 to 1. Backward flow (1) goes from 1 to 0. + image0_layer = patch_layer; + image1_layer = 1 - patch_layer; }