1
0
Fork 0

HDR: Improve the parametrization of the atmosphere

This commit is contained in:
Fernando García Liñán 2024-01-08 18:26:24 +01:00
parent 7b0211031a
commit 6041eed8f7
11 changed files with 229 additions and 41 deletions

View file

@ -24,12 +24,18 @@
<aerosol-scale-height>
<use>/sim/rendering/hdr/atmos/aerosol-scale-height</use>
</aerosol-scale-height>
<aerosol-turbidity>
<use>/sim/rendering/hdr/atmos/aerosol-turbidity</use>
</aerosol-turbidity>
<fog-density>
<use>/sim/rendering/hdr/atmos/fog-density</use>
</fog-density>
<fog-scale-height>
<use>/sim/rendering/hdr/atmos/fog-scale-height</use>
</fog-scale-height>
<fog-height-offset>
<use>/sim/rendering/hdr/atmos/fog-height-offset</use>
</fog-height-offset>
<ozone-mean-dobson>
<use>/sim/rendering/hdr/atmos/ozone-mean-dobson</use>
</ozone-mean-dobson>
@ -81,6 +87,11 @@
<type>float</type>
<value><use>aerosol-scale-height</use></value>
</uniform>
<uniform>
<name>aerosol_turbidity</name>
<type>float</type>
<value><use>aerosol-turbidity</use></value>
</uniform>
<uniform>
<name>fog_density</name>
<type>float</type>
@ -91,6 +102,11 @@
<type>float</type>
<value><use>fog-scale-height</use></value>
</uniform>
<uniform>
<name>fog_height_offset</name>
<type>float</type>
<value><use>fog-height-offset</use></value>
</uniform>
<uniform>
<name>ozone_mean_dobson</name>
<type>float</type>

View file

@ -24,12 +24,18 @@
<aerosol-scale-height>
<use>/sim/rendering/hdr/atmos/aerosol-scale-height</use>
</aerosol-scale-height>
<aerosol-turbidity>
<use>/sim/rendering/hdr/atmos/aerosol-turbidity</use>
</aerosol-turbidity>
<fog-density>
<use>/sim/rendering/hdr/atmos/fog-density</use>
</fog-density>
<fog-scale-height>
<use>/sim/rendering/hdr/atmos/fog-scale-height</use>
</fog-scale-height>
<fog-height-offset>
<use>/sim/rendering/hdr/atmos/fog-height-offset</use>
</fog-height-offset>
<ozone-mean-dobson>
<use>/sim/rendering/hdr/atmos/ozone-mean-dobson</use>
</ozone-mean-dobson>
@ -79,6 +85,11 @@
<type>float</type>
<value><use>aerosol-scale-height</use></value>
</uniform>
<uniform>
<name>aerosol_turbidity</name>
<type>float</type>
<value><use>aerosol-turbidity</use></value>
</uniform>
<uniform>
<name>fog_density</name>
<type>float</type>
@ -89,6 +100,11 @@
<type>float</type>
<value><use>fog-scale-height</use></value>
</uniform>
<uniform>
<name>fog_height_offset</name>
<type>float</type>
<value><use>fog-height-offset</use></value>
</uniform>
<uniform>
<name>ozone_mean_dobson</name>
<type>float</type>

View file

@ -10,10 +10,10 @@
<use>/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[3]</use>
</aerosol-absorption-cross-section>
<aerosol-scattering-cross-section type="vec4d">
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]</use>
</aerosol-scattering-cross-section>
<aerosol-base-density>
<use>/sim/rendering/hdr/atmos/aerosol-base-density</use>
@ -24,12 +24,18 @@
<aerosol-scale-height>
<use>/sim/rendering/hdr/atmos/aerosol-scale-height</use>
</aerosol-scale-height>
<aerosol-turbidity>
<use>/sim/rendering/hdr/atmos/aerosol-turbidity</use>
</aerosol-turbidity>
<fog-density>
<use>/sim/rendering/hdr/atmos/fog-density</use>
</fog-density>
<fog-scale-height>
<use>/sim/rendering/hdr/atmos/fog-scale-height</use>
</fog-scale-height>
<fog-height-offset>
<use>/sim/rendering/hdr/atmos/fog-height-offset</use>
</fog-height-offset>
<ozone-mean-dobson>
<use>/sim/rendering/hdr/atmos/ozone-mean-dobson</use>
</ozone-mean-dobson>
@ -74,6 +80,11 @@
<type>float</type>
<value><use>aerosol-scale-height</use></value>
</uniform>
<uniform>
<name>aerosol_turbidity</name>
<type>float</type>
<value><use>aerosol-turbidity</use></value>
</uniform>
<uniform>
<name>fog_density</name>
<type>float</type>
@ -84,6 +95,11 @@
<type>float</type>
<value><use>fog-scale-height</use></value>
</uniform>
<uniform>
<name>fog_height_offset</name>
<type>float</type>
<value><use>fog-height-offset</use></value>
</uniform>
<uniform>
<name>ozone_mean_dobson</name>
<type>float</type>

View file

@ -47,12 +47,18 @@
<aerosol-scale-height>
<use>/sim/rendering/hdr/atmos/aerosol-scale-height</use>
</aerosol-scale-height>
<aerosol-turbidity>
<use>/sim/rendering/hdr/atmos/aerosol-turbidity</use>
</aerosol-turbidity>
<fog-density>
<use>/sim/rendering/hdr/atmos/fog-density</use>
</fog-density>
<fog-scale-height>
<use>/sim/rendering/hdr/atmos/fog-scale-height</use>
</fog-scale-height>
<fog-height-offset>
<use>/sim/rendering/hdr/atmos/fog-height-offset</use>
</fog-height-offset>
<ozone-mean-dobson>
<use>/sim/rendering/hdr/atmos/ozone-mean-dobson</use>
</ozone-mean-dobson>
@ -405,6 +411,11 @@
<type>float</type>
<value><use>aerosol-scale-height</use></value>
</uniform>
<uniform>
<name>aerosol_turbidity</name>
<type>float</type>
<value><use>aerosol-turbidity</use></value>
</uniform>
<uniform>
<name>fog_density</name>
<type>float</type>
@ -415,6 +426,11 @@
<type>float</type>
<value><use>fog-scale-height</use></value>
</uniform>
<uniform>
<name>fog_height_offset</name>
<type>float</type>
<value><use>fog-height-offset</use></value>
</uniform>
<uniform>
<name>ozone_mean_dobson</name>
<type>float</type>

View file

@ -34,12 +34,18 @@
<aerosol-scale-height>
<use>/sim/rendering/hdr/atmos/aerosol-scale-height</use>
</aerosol-scale-height>
<aerosol-turbidity>
<use>/sim/rendering/hdr/atmos/aerosol-turbidity</use>
</aerosol-turbidity>
<fog-density>
<use>/sim/rendering/hdr/atmos/fog-density</use>
</fog-density>
<fog-scale-height>
<use>/sim/rendering/hdr/atmos/fog-scale-height</use>
</fog-scale-height>
<fog-height-offset>
<use>/sim/rendering/hdr/atmos/fog-height-offset</use>
</fog-height-offset>
<ozone-mean-dobson>
<use>/sim/rendering/hdr/atmos/ozone-mean-dobson</use>
</ozone-mean-dobson>
@ -325,6 +331,11 @@
<type>float</type>
<value><use>aerosol-scale-height</use></value>
</uniform>
<uniform>
<name>aerosol_turbidity</name>
<type>float</type>
<value><use>aerosol-turbidity</use></value>
</uniform>
<uniform>
<name>fog_density</name>
<type>float</type>
@ -335,6 +346,11 @@
<type>float</type>
<value><use>fog-scale-height</use></value>
</uniform>
<uniform>
<name>fog_height_offset</name>
<type>float</type>
<value><use>fog-height-offset</use></value>
</uniform>
<uniform>
<name>ozone_mean_dobson</name>
<type>float</type>

View file

@ -32,10 +32,10 @@
<use>/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[3]</use>
</aerosol-absorption-cross-section>
<aerosol-scattering-cross-section type="vec4d">
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]</use>
</aerosol-scattering-cross-section>
<aerosol-base-density>
<use>/sim/rendering/hdr/atmos/aerosol-base-density</use>
@ -46,12 +46,18 @@
<aerosol-scale-height>
<use>/sim/rendering/hdr/atmos/aerosol-scale-height</use>
</aerosol-scale-height>
<aerosol-turbidity>
<use>/sim/rendering/hdr/atmos/aerosol-turbidity</use>
</aerosol-turbidity>
<fog-density>
<use>/sim/rendering/hdr/atmos/fog-density</use>
</fog-density>
<fog-scale-height>
<use>/sim/rendering/hdr/atmos/fog-scale-height</use>
</fog-scale-height>
<fog-height-offset>
<use>/sim/rendering/hdr/atmos/fog-height-offset</use>
</fog-height-offset>
<ozone-mean-dobson>
<use>/sim/rendering/hdr/atmos/ozone-mean-dobson</use>
</ozone-mean-dobson>
@ -533,6 +539,11 @@
<type>float</type>
<value><use>aerosol-scale-height</use></value>
</uniform>
<uniform>
<name>aerosol_turbidity</name>
<type>float</type>
<value><use>aerosol-turbidity</use></value>
</uniform>
<uniform>
<name>fog_density</name>
<type>float</type>
@ -543,6 +554,11 @@
<type>float</type>
<value><use>fog-scale-height</use></value>
</uniform>
<uniform>
<name>fog_height_offset</name>
<type>float</type>
<value><use>fog-height-offset</use></value>
</uniform>
<uniform>
<name>ozone_mean_dobson</name>
<type>float</type>

View file

@ -53,12 +53,18 @@
<aerosol-scale-height>
<use>/sim/rendering/hdr/atmos/aerosol-scale-height</use>
</aerosol-scale-height>
<aerosol-turbidity>
<use>/sim/rendering/hdr/atmos/aerosol-turbidity</use>
</aerosol-turbidity>
<fog-density>
<use>/sim/rendering/hdr/atmos/fog-density</use>
</fog-density>
<fog-scale-height>
<use>/sim/rendering/hdr/atmos/fog-scale-height</use>
</fog-scale-height>
<fog-height-offset>
<use>/sim/rendering/hdr/atmos/fog-height-offset</use>
</fog-height-offset>
<ozone-mean-dobson>
<use>/sim/rendering/hdr/atmos/ozone-mean-dobson</use>
</ozone-mean-dobson>
@ -682,6 +688,11 @@
<type>float</type>
<value><use>aerosol-scale-height</use></value>
</uniform>
<uniform>
<name>aerosol_turbidity</name>
<type>float</type>
<value><use>aerosol-turbidity</use></value>
</uniform>
<uniform>
<name>fog_density</name>
<type>float</type>
@ -692,6 +703,11 @@
<type>float</type>
<value><use>fog-scale-height</use></value>
</uniform>
<uniform>
<name>fog_height_offset</name>
<type>float</type>
<value><use>fog-height-offset</use></value>
</uniform>
<uniform>
<name>ozone_mean_dobson</name>
<type>float</type>

View file

@ -197,10 +197,10 @@
<use>/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[3]</use>
</aerosol-absorption-cross-section>
<aerosol-scattering-cross-section type="vec4d">
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]</use>
<use>/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]</use>
</aerosol-scattering-cross-section>
<aerosol-base-density>
<use>/sim/rendering/hdr/atmos/aerosol-base-density</use>
@ -211,12 +211,18 @@
<aerosol-scale-height>
<use>/sim/rendering/hdr/atmos/aerosol-scale-height</use>
</aerosol-scale-height>
<aerosol-turbidity>
<use>/sim/rendering/hdr/atmos/aerosol-turbidity</use>
</aerosol-turbidity>
<fog-density>
<use>/sim/rendering/hdr/atmos/fog-density</use>
</fog-density>
<fog-scale-height>
<use>/sim/rendering/hdr/atmos/fog-scale-height</use>
</fog-scale-height>
<fog-height-offset>
<use>/sim/rendering/hdr/atmos/fog-height-offset</use>
</fog-height-offset>
<ozone-mean-dobson>
<use>/sim/rendering/hdr/atmos/ozone-mean-dobson</use>
</ozone-mean-dobson>
@ -1820,6 +1826,11 @@
<type>float</type>
<value><use>aerosol-scale-height</use></value>
</uniform>
<uniform>
<name>aerosol_turbidity</name>
<type>float</type>
<value><use>aerosol-turbidity</use></value>
</uniform>
<uniform>
<name>fog_density</name>
<type>float</type>
@ -1830,6 +1841,11 @@
<type>float</type>
<value><use>fog-scale-height</use></value>
</uniform>
<uniform>
<name>fog_height_offset</name>
<type>float</type>
<value><use>fog-height-offset</use></value>
</uniform>
<uniform>
<name>ozone_mean_dobson</name>
<type>float</type>

View file

@ -540,5 +540,14 @@
<darksky-brightness-magnitude type="float">22.0</darksky-brightness-magnitude>
<galaxy-bulge-brightness-magnitude type="float">20.3</galaxy-bulge-brightness-magnitude>
<!-- Parameters used by the HDR atmosphere shaders -->
<aerosols>
<type type="int" userarchive="y">8</type>
<turbidity type="float" userarchive="y">1.0</turbidity>
</aerosols>
<ground-albedo type="float" userarchive="y">0.3</ground-albedo>
<fog-height-falloff type="float" userarchive="y">1.0</fog-height-falloff>
<fog-height-offset type="float" userarchive="y">0.0</fog-height-offset>
</PropertyList>

View file

@ -13,27 +13,84 @@
################################################################################
# Atmosphere
################################################################################
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[0]", 2.8722e-24);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[1]", 4.6168e-24);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[2]", 7.9706e-24);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[3]", 1.3578e-23);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]", 1.5908e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]", 1.7711e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]", 2.0942e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]", 2.4033e-22);
setlistener("/environment/aerosols/type", func(p) {
var type = p.getValue();
if (type == 7) { # Rural
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[0]", 5.0393e-23);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[1]", 8.0765e-23);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[2]", 1.3823e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[3]", 2.3383e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]", 2.6004e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]", 2.4844e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]", 2.8362e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]", 2.7494e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-base-density", 8.544e18);
setprop("/sim/rendering/hdr/atmos/aerosol-relative-background-density", 2.340824e-16);
setprop("/sim/rendering/hdr/atmos/aerosol-scale-height", 0.73);
} else { # Urban (default)
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[0]", 2.8722e-24);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[1]", 4.6168e-24);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[2]", 7.9706e-24);
setprop("/sim/rendering/hdr/atmos/aerosol-absorption-cross-section[3]", 1.3578e-23);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[0]", 1.5908e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[1]", 1.7711e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[2]", 2.0942e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-scattering-cross-section[3]", 2.4033e-22);
setprop("/sim/rendering/hdr/atmos/aerosol-base-density", 1.3681e17);
setprop("/sim/rendering/hdr/atmos/aerosol-relative-background-density", 1.4619e-17);
setprop("/sim/rendering/hdr/atmos/aerosol-scale-height", 0.73);
}
}, 1, 0);
setprop("/sim/rendering/hdr/atmos/aerosol-base-density", 1.3681e17);
setprop("/sim/rendering/hdr/atmos/aerosol-relative-background-density", 1.4619e-17);
setprop("/sim/rendering/hdr/atmos/aerosol-scale-height", 0.73);
setprop("/sim/rendering/hdr/atmos/fog-density", 0.0);
setprop("/sim/rendering/hdr/atmos/fog-scale-height", 1.0);
setprop("/sim/rendering/hdr/atmos/ozone-mean-dobson", 347.0);
setlistener("/environment/aerosols/turbidity", func(p) {
setprop("/sim/rendering/hdr/atmos/aerosol-turbidity", p.getValue());
}, 1, 0);
setprop("/sim/rendering/hdr/atmos/ground-albedo[0]", 0.4);
setprop("/sim/rendering/hdr/atmos/ground-albedo[1]", 0.4);
setprop("/sim/rendering/hdr/atmos/ground-albedo[2]", 0.4);
setprop("/sim/rendering/hdr/atmos/ground-albedo[3]", 0.4);
setlistener("/environment/ground-albedo", func(p) {
var albedo = p.getValue();
# Use the same albedo value for all wavelengths
for (var i = 0; i < 4; i += 1) {
setprop("/sim/rendering/hdr/atmos/ground-albedo[" ~ i ~ "]", albedo);
}
}, 1, 0);
# Update fog density when the visibility changes
setlistener("/environment/visibility-m", func {
var max = 30000000.0;
var visibility = getprop("/environment/visibility-m");
var vis = math.min(visibility, max);
setprop("/sim/rendering/hdr/atmos/fog-density", max*math.pow(0.99937, vis));
}, 1, 0);
setlistener("/environment/fog-height-falloff", func(p) {
setprop("/sim/rendering/hdr/atmos/fog-scale-height", p.getValue());
}, 1, 0);
setlistener("/environment/fog-height-offset", func(p) {
setprop("/sim/rendering/hdr/atmos/fog-height-offset", p.getValue());
}, 1, 0);
# Ozone concentration depends on the month of the year
setlistener("/sim/time/utc/month", func {
var ozone_mean_monthly_dobson = [
347.0, # January
370.0, # February
381.0, # March
384.0, # April
372.0, # May
352.0, # June
333.0, # July
317.0, # August
298.0, # September
285.0, # October
290.0, # November
315.0 # December
];
var month = getprop("/sim/time/utc/month") or 1;
var index = math.clamp(month - 1, 0, 11);
setprop("/sim/rendering/hdr/atmos/ozone-mean-dobson", ozone_mean_monthly_dobson[index]);
}, 1, 0);
################################################################################
# Environment map
@ -230,11 +287,3 @@ envmap_warp_listener = setlistener("/sim/time/warp",
setlistener("/sim/current-view/view-number", func {
update_envmap(true);
}, 0, 0);
# Update fog density when the visibility changes
setlistener("/environment/visibility-m", func {
var max = 30000000.0;
var visibility = getprop("/environment/visibility-m");
var vis = math.min(visibility, max);
setprop("/sim/rendering/hdr/atmos/fog-density", max*math.pow(0.99937, vis));
}, 1, 0);

View file

@ -15,8 +15,10 @@ uniform vec4 aerosol_scattering_cross_section;
uniform float aerosol_base_density;
uniform float aerosol_relative_background_density;
uniform float aerosol_scale_height;
uniform float aerosol_turbidity;
uniform float fog_density;
uniform float fog_scale_height;
uniform float fog_height_offset;
uniform float ozone_mean_dobson;
uniform vec4 ground_albedo;
@ -171,8 +173,8 @@ vec4 get_molecular_absorption_coefficient(float h)
*/
float get_aerosol_density(float h)
{
return aerosol_base_density * (exp(-h / aerosol_scale_height)
+ aerosol_relative_background_density);
return aerosol_turbidity * aerosol_base_density
* (exp(-h / aerosol_scale_height) + aerosol_relative_background_density);
}
/*
@ -186,7 +188,7 @@ vec4 get_fog_scattering_coefficient(float h)
{
if (fog_density > 0.0) {
return fog_scattering_cross_section * fog_density
* exp(-h / fog_scale_height);
* min(1.0, exp((-h + fog_height_offset) / fog_scale_height));
} else {
return vec4(0.0);
}