]> git.sesse.net Git - nageru/blobdiff - futatabi/motion_search.vert
Move everything into a separate futatabi/ subdir, for the upcoming merge with Nageru.
[nageru] / futatabi / motion_search.vert
diff --git a/futatabi/motion_search.vert b/futatabi/motion_search.vert
new file mode 100644 (file)
index 0000000..d023276
--- /dev/null
@@ -0,0 +1,47 @@
+#version 450 core
+#extension GL_ARB_shader_viewport_layer_array : require
+
+layout(location=0) in vec2 position;
+out vec3 flow_tc;
+out vec2 patch_center;
+flat out int ref_layer, search_layer;
+
+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
+       //   0.000  2.000  0.000 -1.000
+       //   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 = vec3(position, gl_InstanceID);
+
+       gl_Layer = gl_InstanceID;
+
+       // 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;
+}