]> git.sesse.net Git - nageru/blobdiff - futatabi/diffusivity.frag
Move everything into a separate futatabi/ subdir, for the upcoming merge with Nageru.
[nageru] / futatabi / diffusivity.frag
diff --git a/futatabi/diffusivity.frag b/futatabi/diffusivity.frag
new file mode 100644 (file)
index 0000000..345c3eb
--- /dev/null
@@ -0,0 +1,39 @@
+#version 450 core
+
+in vec3 tc;
+out float g;
+const float eps_sq = 0.001 * 0.001;
+
+uniform sampler2DArray flow_tex, diff_flow_tex;
+
+// Relative weighting of smoothness term.
+uniform float alpha;
+
+uniform bool zero_diff_flow;
+
+// This must be a macro, since the offset needs to be a constant expression.
+#define get_flow(x_offs, y_offs) \
+       (textureOffset(flow_tex, tc, ivec2((x_offs), (y_offs))).xy + \
+       textureOffset(diff_flow_tex, tc, ivec2((x_offs), (y_offs))).xy)
+
+#define get_flow_no_diff(x_offs, y_offs) \
+       textureOffset(flow_tex, tc, ivec2((x_offs), (y_offs))).xy
+
+float diffusivity(float u_x, float u_y, float v_x, float v_y)
+{
+       return alpha * inversesqrt(u_x * u_x + u_y * u_y + v_x * v_x + v_y * v_y + eps_sq);
+}
+
+void main()
+{
+       // Find diffusivity (g) for this pixel, using central differences.
+       if (zero_diff_flow) {
+               vec2 uv_x = get_flow_no_diff(1, 0) - get_flow_no_diff(-1,  0);
+               vec2 uv_y = get_flow_no_diff(0, 1) - get_flow_no_diff( 0, -1);
+               g = diffusivity(uv_x.x, uv_y.x, uv_x.y, uv_y.y);
+       } else {
+               vec2 uv_x = get_flow(1, 0) - get_flow(-1,  0);
+               vec2 uv_y = get_flow(0, 1) - get_flow( 0, -1);
+               g = diffusivity(uv_x.x, uv_y.x, uv_x.y, uv_y.y);
+       }
+}