X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fdiffusivity.frag;fp=futatabi%2Fdiffusivity.frag;h=345c3ebf0a8b1815646db7069ba6fbd8d85717c3;hb=6e116a6bbeb2c047a3bfb084395ec601ce211e6c;hp=0000000000000000000000000000000000000000;hpb=ce2e0615420b706e1ff2405fffcedfba37a9adac;p=nageru diff --git a/futatabi/diffusivity.frag b/futatabi/diffusivity.frag new file mode 100644 index 0000000..345c3eb --- /dev/null +++ b/futatabi/diffusivity.frag @@ -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); + } +}