]> git.tdb.fi Git - libs/gl.git/commitdiff
Tweak the logic in sky raymarching to avoid false shadowing
authorMikko Rasa <tdb@tdb.fi>
Sat, 16 Oct 2021 15:34:15 +0000 (18:34 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 16 Oct 2021 16:03:01 +0000 (19:03 +0300)
Ray_sphere_intersection now always returns the ingoing hit if radius is
positive or outgoing hit if radius is negative.  This avoids a ray
starting at ground level towards the sky immediately hitting the ground.

builtin_data/_sky.glsl

index 81f9d16398693ba16018b9f17ebe9bfbd04b780b..1dbda5793f2d838018b1f8558ede2da7f03437da 100644 (file)
@@ -88,13 +88,8 @@ float ray_sphere_intersect(vec3 ray_start, vec3 ray_dir, vec3 sphere_center, flo
        if(d_sq>r_sq)
                return -1.0;
 
-       float offset = sqrt(r_sq-d_sq);
-       if(offset<t)
-               return t-offset;
-       else if(offset>-t)
-               return t+offset;
-       else
-               return -1.0;
+       float offset = sqrt(r_sq-d_sq)*sign(sphere_radius);
+       return t-offset;
 }
 
 #pragma MSP stage(fragment)
@@ -110,7 +105,7 @@ OpticalPathInfo raymarch_path(float start_height, vec3 look_dir)
        vec3 path_extinction = vec3(0.0);
 
        float ground_t = ray_sphere_intersect(pos, look_dir, planet_center, planet_radius);
-       float space_t = ray_sphere_intersect(pos, look_dir, planet_center, planet_radius+atmosphere_thickness);
+       float space_t = ray_sphere_intersect(pos, look_dir, planet_center, -(planet_radius+atmosphere_thickness));
        float ray_length = (ground_t>0.0 ? ground_t : space_t);
        float step_size = ray_length/n_steps;
 
@@ -123,7 +118,7 @@ OpticalPathInfo raymarch_path(float start_height, vec3 look_dir)
 
                AtmosphericEvents ev = calculate_events(height);
                vec3 transmittance = exp(-path_extinction);
-               float in_ground_t = ray_sphere_intersect(pos+light_dir, light_dir, planet_center, planet_radius);
+               float in_ground_t = ray_sphere_intersect(pos, light_dir, planet_center, planet_radius);
                if(in_ground_t<0.0)
                {
                        vec3 in_transmittance = texture(transmittance_lookup, vec2(sqrt(height/atmosphere_thickness), light_z)).rgb;