From 0542080f04c13236dc04a4f19e8a30016ad86bfa Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 16 Oct 2021 18:34:15 +0300 Subject: [PATCH] Tweak the logic in sky raymarching to avoid false shadowing 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 | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/builtin_data/_sky.glsl b/builtin_data/_sky.glsl index 81f9d163..1dbda579 100644 --- a/builtin_data/_sky.glsl +++ b/builtin_data/_sky.glsl @@ -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 - 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; -- 2.43.0