]> git.sesse.net Git - nageru/blobdiff - sor.vert
Split the equation texture in two, which speeds up SOR by ~30%.
[nageru] / sor.vert
index 55d1a90f40e013da429098147aa2d68c2d2509d1..32498decf948f4afe6972e313e822918416405f4 100644 (file)
--- a/sor.vert
+++ b/sor.vert
@@ -2,9 +2,12 @@
 
 layout(location=0) in vec2 position;
 out vec2 tc, tc_left, tc_down;
+out vec2 equation_tc_assuming_left, equation_tc_assuming_right;
+out float element_x_idx;
 out float element_sum_idx;
 
 uniform sampler2D diff_flow_tex, diffusivity_tex;
+uniform usampler2D equation_red_tex;
 
 void main()
 {
@@ -19,6 +22,17 @@ void main()
        tc_left = vec2(tc.x - 0.5f / textureSize(diffusivity_tex, 0).x, tc.y);
        tc_down = vec2(tc.x, tc.y - 0.5f / textureSize(diffusivity_tex, 0).y);
 
-       vec2 element_idx = position * textureSize(diff_flow_tex, 0) - 0.5;
+       // The equation textures have half the horizontal width, so we need to adjust the texel centers.
+       // It becomes extra tricky since the SOR texture might be of odd size, and then
+       // the equation texture is not exactly half the size.
+       vec2 element_idx = position * textureSize(diff_flow_tex, 0) - 0.5f;
+       float equation_texel_number_assuming_left = element_idx.x / 2.0f;
+       float equation_texel_number_assuming_right = (element_idx.x - 1.0f) / 2.0f;
+       equation_tc_assuming_left.x = (equation_texel_number_assuming_left + 0.5f) / textureSize(equation_red_tex, 0).x;
+       equation_tc_assuming_right.x = (equation_texel_number_assuming_right + 0.5f) / textureSize(equation_red_tex, 0).x;
+       equation_tc_assuming_left.y = tc.y;
+       equation_tc_assuming_right.y = tc.y;
+
+       element_x_idx = element_idx.x;
        element_sum_idx = element_idx.x + element_idx.y;
 }