]> git.tdb.fi Git - libs/gl.git/blobdiff - builtin_data/_sky.glsl
Check the flat qualifier from the correct member
[libs/gl.git] / builtin_data / _sky.glsl
index 45ca330dd80afd89f7845f07d353fc8f5fe2d4e5..4ece8e579a3f7ad5e186e21a5793ebdaef3e0263 100644 (file)
@@ -6,7 +6,7 @@ struct AtmosphericEvents
        vec3 ozone_absorb;
 };
 
-uniform Atmosphere
+layout(set=2) uniform Atmosphere
 {
        AtmosphericEvents events;
        float rayleigh_density_decay;
@@ -19,7 +19,7 @@ uniform Atmosphere
        int n_steps;
 };
 
-uniform View
+layout(set=2) uniform View
 {
        float view_height;
        vec4 light_color;
@@ -32,10 +32,9 @@ struct OpticalPathInfo
        vec3 luminance;
 };
 
-const float pi = 3.1415926535;
 const float mie_asymmetry = 0.8;
 
-uniform sampler2D transmittance_lookup;
+layout(set=2) uniform sampler2D transmittance_lookup;
 
 vec3 rayleigh_density(vec3 base, float height)
 {
@@ -44,7 +43,7 @@ vec3 rayleigh_density(vec3 base, float height)
 
 float rayleigh_phase(float cos_theta)
 {
-       return 3.0*(1.0+cos_theta*cos_theta)/(16.0*pi);
+       return 3.0*(1.0+cos_theta*cos_theta)/(16.0*PI);
 }
 
 vec3 mie_density(vec3 base, float height)
@@ -57,7 +56,7 @@ float mie_phase(float cos_theta)
        float g = mie_asymmetry;
        float num = (1.0-g*g)*(1.0+cos_theta*cos_theta);
        float denom = (2.0+g*g)*pow(1.0+g*g-2.0*g*cos_theta, 1.5);
-       return 3.0/(8.0*pi)*num/denom;
+       return 3.0/(8.0*PI)*num/denom;
 }
 
 vec3 ozone_density(vec3 base, float height)
@@ -89,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)
@@ -111,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;
 
@@ -124,11 +118,15 @@ OpticalPathInfo raymarch_path(float start_height, vec3 look_dir)
 
                AtmosphericEvents ev = calculate_events(height);
                vec3 transmittance = exp(-path_extinction);
-               vec3 in_transmittance = texture(transmittance_lookup, vec2(sqrt(height/atmosphere_thickness), light_z)).rgb;
-               vec3 in_luminance = (ev.rayleigh_scatter*p_rayleigh+ev.mie_scatter*p_mie)*step_size;
-               if(i==n_steps && ground_t>0.0)
-                       in_luminance += ground_albedo*light_z/pi;
-               path_luminance += transmittance*in_transmittance*in_luminance;
+               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;
+                       vec3 in_luminance = (ev.rayleigh_scatter*p_rayleigh+ev.mie_scatter*p_mie)*step_size;
+                       if(i==n_steps && ground_t>0.0 && light_z>0.0)
+                               in_luminance += ground_albedo*light_z/PI;
+                       path_luminance += transmittance*in_transmittance*in_luminance;
+               }
 
                path_extinction += total_extinction(ev)*step_size;
                pos += look_dir*step_size;