X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=motion_search.vert;h=d0232767fbcef03434d18ad532ffbc0e0bbf870d;hb=3795723be95f2fe82f3c8b8b45b1a905b2c811fd;hp=dbb27956814ed3438b892dc9ed95256587746ebc;hpb=d51c933ab4f9cbd90b4c5577d5d9ed5d89afefb4;p=nageru diff --git a/motion_search.vert b/motion_search.vert index dbb2795..d023276 100644 --- a/motion_search.vert +++ b/motion_search.vert @@ -1,13 +1,35 @@ #version 450 core +#extension GL_ARB_shader_viewport_layer_array : require -in vec2 position; -out vec2 flow_tc; -out vec2 patch_bottom_left_texel; // Center of bottom-left texel of patch. +layout(location=0) in vec2 position; +out vec3 flow_tc; +out vec2 patch_center; +flat out int ref_layer, search_layer; -uniform vec2 inv_flow_size, inv_image_size; +uniform sampler2DArray flow_tex; +uniform vec2 out_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 = out_flow_size / (out_flow_size - 1); + vec2 b = -1.0 / (2 * (out_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 @@ -15,8 +37,11 @@ void main() // 0.000 0.000 -2.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; + flow_tc = vec3(position, gl_InstanceID); + + gl_Layer = gl_InstanceID; - 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; + // Forward flow (0) goes from 0 to 1. Backward flow (1) goes from 1 to 0. + ref_layer = gl_InstanceID; + search_layer = 1 - gl_InstanceID; }