X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=builtin_data%2F_sky.glsl;h=1dbda5793f2d838018b1f8558ede2da7f03437da;hb=HEAD;hp=45ca330dd80afd89f7845f07d353fc8f5fe2d4e5;hpb=06d83c11e10208478487dea864ddd7822630c391;p=libs%2Fgl.git diff --git a/builtin_data/_sky.glsl b/builtin_data/_sky.glsl index 45ca330d..4ece8e57 100644 --- a/builtin_data/_sky.glsl +++ b/builtin_data/_sky.glsl @@ -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 - 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;