@@ -13,13 +13,15 @@ struct SkySettings {
1313 int updateType;
1414};
1515
16- #define ANIMATE_SUN 0
16+ struct AerosolParams {
17+ vec4 aerosol_absorption_cross_section;
1718
18- // 0=Background, 1=Desert Dust, 2=Maritime Clean, 3=Maritime Mineral,
19- // 4=Polar Antarctic, 5=Polar Artic, 6=Remote Continental, 7=Rural, 8=Urban
20- #define AEROSOL_TYPE 8
19+ vec4 aerosol_scattering_cross_section;
2120
22- const float AEROSOL_TURBIDITY = 1.0 ;
21+ float aerosol_base_density;
22+ float aerosol_background_density;
23+ float aerosol_height_scale;
24+ };
2325
2426// Ray marching steps. More steps mean better accuracy but worse performance
2527const int TRANSMITTANCE_STEPS = 32 ;
@@ -38,7 +40,6 @@ const float CAMERA_ROLL = 0.0;
3840#define ENABLE_MULTIPLE_SCATTERING 1
3941#define ENABLE_AEROSOLS 1
4042#define SHOW_RELATIVE_LUMINANCE 0
41- #define TONEMAPPING_TECHNIQUE 0 // 0=ACES, 1=simple
4243
4344// -----------------------------------------------------------------------------
4445// Constants
@@ -98,75 +99,6 @@ const float ozone_mean_monthly_dobson[] = float[](
9899 315.0 // December
99100);
100101
101- /*
102- * Every aerosol type expects 5 parameters:
103- * - Scattering cross section
104- * - Absorption cross section
105- * - Base density (km^-3)
106- * - Background density (km^-3)
107- * - Height scaling parameter
108- * These parameters can be sent as uniforms.
109- *
110- * This model for aerosols and their corresponding parameters come from
111- * "A Physically-Based Spatio-Temporal Sky Model"
112- * by Guimera et al. (2018).
113- */
114- #if AEROSOL_TYPE == 0 // Background
115- const vec4 aerosol_absorption_cross_section = vec4 (4.5517e-19 , 5.9269e-19 , 6.9143e-19 , 8.5228e-19 );
116- const vec4 aerosol_scattering_cross_section = vec4 (1.8921e-26 , 1.6951e-26 , 1.7436e-26 , 2.1158e-26 );
117- const float aerosol_base_density = 2.584e17 ;
118- const float aerosol_background_density = 2e6 ;
119- #elif AEROSOL_TYPE == 1 // Desert Dust
120- const vec4 aerosol_absorption_cross_section = vec4 (4.6758e-16 , 4.4654e-16 , 4.1989e-16 , 4.1493e-16 );
121- const vec4 aerosol_scattering_cross_section = vec4 (2.9144e-16 , 3.1463e-16 , 3.3902e-16 , 3.4298e-16 );
122- const float aerosol_base_density = 1.8662e18 ;
123- const float aerosol_background_density = 2e6 ;
124- const float aerosol_height_scale = 2.0 ;
125- #elif AEROSOL_TYPE == 2 // Maritime Clean
126- const vec4 aerosol_absorption_cross_section = vec4 (6.3312e-19 , 7.5567e-19 , 9.2627e-19 , 1.0391e-18 );
127- const vec4 aerosol_scattering_cross_section = vec4 (4.6539e-26 , 2.721e-26 , 4.1104e-26 , 5.6249e-26 );
128- const float aerosol_base_density = 2.0266e17 ;
129- const float aerosol_background_density = 2e6 ;
130- const float aerosol_height_scale = 0.9 ;
131- #elif AEROSOL_TYPE == 3 // Maritime Mineral
132- const vec4 aerosol_absorption_cross_section = vec4 (6.9365e-19 , 7.5951e-19 , 8.2423e-19 , 8.9101e-19 );
133- const vec4 aerosol_scattering_cross_section = vec4 (2.3699e-19 , 2.2439e-19 , 2.2126e-19 , 2.021e-19 );
134- const float aerosol_base_density = 2.0266e17 ;
135- const float aerosol_background_density = 2e6 ;
136- const float aerosol_height_scale = 2.0 ;
137- #elif AEROSOL_TYPE == 4 // Polar Antarctic
138- const vec4 aerosol_absorption_cross_section = vec4 (1.3399e-16 , 1.3178e-16 , 1.2909e-16 , 1.3006e-16 );
139- const vec4 aerosol_scattering_cross_section = vec4 (1.5506e-19 , 1.809e-19 , 2.3069e-19 , 2.5804e-19 );
140- const float aerosol_base_density = 2.3864e16 ;
141- const float aerosol_background_density = 2e6 ;
142- const float aerosol_height_scale = 30.0 ;
143- #elif AEROSOL_TYPE == 5 // Polar Arctic
144- const vec4 aerosol_absorption_cross_section = vec4 (1.0364e-16 , 1.0609e-16 , 1.0193e-16 , 1.0092e-16 );
145- const vec4 aerosol_scattering_cross_section = vec4 (2.1609e-17 , 2.2759e-17 , 2.5089e-17 , 2.6323e-17 );
146- const float aerosol_base_density = 2.3864e16 ;
147- const float aerosol_background_density = 2e6 ;
148- const float aerosol_height_scale = 30.0 ;
149- #elif AEROSOL_TYPE == 6 // Remote Continental
150- const vec4 aerosol_absorption_cross_section = vec4 (4.5307e-18 , 5.0662e-18 , 4.4877e-18 , 3.7917e-18 );
151- const vec4 aerosol_scattering_cross_section = vec4 (1.8764e-18 , 1.746e-18 , 1.6902e-18 , 1.479e-18 );
152- const float aerosol_base_density = 6.103e18 ;
153- const float aerosol_background_density = 2e6 ;
154- const float aerosol_height_scale = 0.73 ;
155- #elif AEROSOL_TYPE == 7 // Rural
156- const vec4 aerosol_absorption_cross_section = vec4 (5.0393e-23 , 8.0765e-23 , 1.3823e-22 , 2.3383e-22 );
157- const vec4 aerosol_scattering_cross_section = vec4 (2.6004e-22 , 2.4844e-22 , 2.8362e-22 , 2.7494e-22 );
158- const float aerosol_base_density = 8.544e18 ;
159- const float aerosol_background_density = 2e6 ;
160- const float aerosol_height_scale = 0.73 ;
161- #elif AEROSOL_TYPE == 8 // Urban
162- const vec4 aerosol_absorption_cross_section = vec4 (2.8722e-24 , 4.6168e-24 , 7.9706e-24 , 1.3578e-23 );
163- const vec4 aerosol_scattering_cross_section = vec4 (1.5908e-22 , 1.7711e-22 , 2.0942e-22 , 2.4033e-22 );
164- const float aerosol_base_density = 1.3681e20 ;
165- const float aerosol_background_density = 2e6 ;
166- const float aerosol_height_scale = 0.73 ;
167- #endif
168- const float aerosol_background_divided_by_base_density = aerosol_background_density / aerosol_base_density;
169-
170102// -----------------------------------------------------------------------------
171103
172104vec3 get_sun_direction(float sunElevationDeg)
@@ -265,14 +197,15 @@ vec4 get_molecular_absorption_coefficient(float h, int month)
265197 return ozone_absorption_cross_section * ozone_mean_monthly_dobson[month] * density;
266198}
267199
268- float get_aerosol_density(float h)
200+ float get_aerosol_density(float h, AerosolParams params )
269201{
270- #if AEROSOL_TYPE == 0 // Only for the Background aerosol type, no dependency on height
271- return aerosol_base_density * ( 1.0 + aerosol_background_divided_by_base_density);
272- #else
273- return aerosol_base_density * (exp (- h / aerosol_height_scale)
202+ const float aerosol_background_divided_by_base_density = params.aerosol_background_density / params.aerosol_base_density;
203+
204+ if (params.aerosol_height_scale != 0.0 )
205+ return params. aerosol_base_density * (exp (- h / params. aerosol_height_scale)
274206 + aerosol_background_divided_by_base_density);
275- #endif
207+ else
208+ return params.aerosol_base_density * (1.0 + aerosol_background_divided_by_base_density);
276209}
277210
278211/*
@@ -282,6 +215,7 @@ float get_aerosol_density(float h)
282215void get_atmosphere_collision_coefficients(in float h,
283216 in int month,
284217 in float turbidity,
218+ in AerosolParams params,
285219 out vec4 aerosol_absorption,
286220 out vec4 aerosol_scattering,
287221 out vec4 molecular_absorption,
@@ -293,9 +227,9 @@ void get_atmosphere_collision_coefficients(in float h,
293227 aerosol_absorption = vec4 (0.0 );
294228 aerosol_scattering = vec4 (0.0 );
295229#else
296- float aerosol_density = get_aerosol_density(h);
297- aerosol_absorption = aerosol_absorption_cross_section * aerosol_density * turbidity;
298- aerosol_scattering = aerosol_scattering_cross_section * aerosol_density * turbidity;
230+ float aerosol_density = get_aerosol_density(h, params );
231+ aerosol_absorption = params. aerosol_absorption_cross_section * aerosol_density * turbidity;
232+ aerosol_scattering = params. aerosol_scattering_cross_section * aerosol_density * turbidity;
299233#endif
300234 molecular_absorption = get_molecular_absorption_coefficient(h, month);
301235 molecular_scattering = get_molecular_scattering_coefficient(h);
0 commit comments