]> git.sesse.net Git - nageru/blob - densify.vert
Rework patch placement. Finally inches our EPE just below the reference code, it...
[nageru] / densify.vert
1 #version 450 core
2
3 in vec2 position;
4 out vec2 image_pos;
5 flat out vec2 flow_du;
6 flat out float mean_diff;
7
8 uniform int width_patches;
9 uniform vec2 patch_size;  // In 0..1 coordinates.
10 uniform vec2 patch_spacing;  // In 0..1 coordinates.
11 uniform sampler2D flow_tex;
12 uniform vec2 flow_size;
13
14 void main()
15 {
16         int patch_x = gl_InstanceID % width_patches;
17         int patch_y = gl_InstanceID / width_patches;
18
19         // Convert the patch index to being the full 0..1 range, to match where
20         // the motion search puts the patches. We don't bother with the locking
21         // to texel centers, though.
22         vec2 patch_center = ivec2(patch_x, patch_y) / (flow_size - 1.0);
23
24         // Increase the patch size a bit; since patch spacing is not necessarily
25         // an integer number of pixels, and we don't use conservative rasterization,
26         // we could be missing the outer edges of the patch. And it seemingly helps
27         // a little bit in general to have some more candidates as well -- although
28         // this is measured without variational refinement, so it might be moot
29         // with it.
30         //
31         // This maps [0.0,1.0] to [-0.25,1.25], ie. extends the patch by 25% in
32         // all directions.
33         vec2 grown_pos = (position * 1.5) - 0.25;
34
35         image_pos = patch_center + patch_size * (grown_pos - 0.5f);
36
37         // Find the flow value for this patch, and send it on to the fragment shader.
38         vec3 flow_du_and_mean_diff = texelFetch(flow_tex, ivec2(patch_x, patch_y), 0).xyz;
39         flow_du = flow_du_and_mean_diff.xy;
40         mean_diff = flow_du_and_mean_diff.z;
41
42         // The result of glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0) is:
43         //
44         //   2.000  0.000  0.000 -1.000
45         //   0.000  2.000  0.000 -1.000
46         //   0.000  0.000 -2.000 -1.000
47         //   0.000  0.000  0.000  1.000
48         gl_Position = vec4(2.0 * image_pos.x - 1.0, 2.0 * image_pos.y - 1.0, -1.0, 1.0);
49 }