Speed up and make more accurate relief mapping
authorRealBadAngel <maciej.kasatkin@o2.pl>
Wed, 9 Dec 2015 22:08:55 +0000 (23:08 +0100)
committerest31 <MTest31@outlook.com>
Thu, 10 Dec 2015 17:24:11 +0000 (18:24 +0100)
using linear + binary search.

client/shaders/nodes_shader/opengl_fragment.glsl

index 424d32177e4213e7f6a73f147a124a4f543082a6..b3789e1cbf61dd3d6ff4891614a4bc68c1222f2d 100644 (file)
@@ -47,15 +47,29 @@ vec4 get_normal_map(vec2 uv)
 
 float find_intersection(vec2 dp, vec2 ds)
 {
-       const float depth_step = 1.0 / 24.0;
        float depth = 1.0;
-       for (int i = 0 ; i < 24 ; i++) {
+       float best_depth = 0.0;
+       float size = 0.0625;
+       for (int i = 0; i < 15; i++) {
+               depth -= size;
                float h = texture2D(normalTexture, dp + ds * depth).a;
-               if (h >= depth)
+               if (depth <= h) {
+                       best_depth = depth;
                        break;
-               depth -= depth_step;
+               }
        }
-       return depth;
+       depth = best_depth;
+       for (int i = 0; i < 4; i++) {
+               size *= 0.5;
+               float h = texture2D(normalTexture,dp + ds * depth).a;
+               if (depth <= h) {
+                       best_depth = depth;
+                       depth += size;
+               } else {
+                       depth -= size;
+               }
+       }
+       return best_depth;
 }
 
 float find_intersectionRGB(vec2 dp, vec2 ds)