45static const float G = 0.8f;
63 6.605e-3f, 1.067e-2f, 1.842e-2f, 3.156e-2f);
65 3.472e-25f, 3.914e-25f, 1.349e-25f, 11.03e-27f);
69 2.8722e-24f, 4.6168e-24f, 7.9706e-24f, 1.3578e-23f);
71 1.5908e-22f, 1.7711e-22f, 2.0942e-22f, 2.4033e-22f);
77 make_float3(53.386917738564668023f, 22.981337506691024754f, 0.0f),
78 make_float3(43.904844466369358263f, 71.347795700053393866f, 0.102506867965741307f),
79 make_float3(1.6137278251608962005f, 18.422960591455485011f, 31.742921188390805758f),
80 make_float3(20.762668673810577145f, 2.3614213523314368527f, 110.48009643252140334f),
101 const float log_h =
logf(
fmaxf(h, 1e-4f));
102 float density = 3.78547397e20f *
expf(-
sqr(log_h - 3.22261f) * 5.55555555f - log_h);
115 for (
int i = 0;
i < 4;
i++) {
135 const float distance_to_earth_center =
mix(
143 const float t = (
step + 0.5f) * t_step;
144 const float3 x_t = ray_origin + sun_dir * t;
146 float4 aerosol_absorption, aerosol_scattering, molecular_absorption, molecular_scattering;
150 molecular_absorption,
151 molecular_scattering);
152 const float4 extinction = aerosol_absorption + aerosol_scattering + molecular_absorption +
153 molecular_scattering;
154 result += extinction * t_step;
164 const float t_d)
const
173 const float t = (
i + 0.5f) * dt;
174 const float3 x_t = ray_origin + ray_dir * t;
175 const float distance_to_earth_center = x_t.
length();
176 const float3 zenith_dir = x_t / distance_to_earth_center;
179 const float sample_cos_theta =
dot(zenith_dir, sun_dir);
180 float4 aerosol_absorption, aerosol_scattering, molecular_absorption, molecular_scattering;
184 molecular_absorption,
185 molecular_scattering);
186 const float4 extinction = aerosol_absorption + aerosol_scattering + molecular_absorption +
187 molecular_scattering;
189 normalized_altitude);
191 sample_cos_theta, normalized_altitude, distance_to_earth_center);
193 (molecular_scattering * (molecular_phase * transmittance_to_sun + ms) +
194 aerosol_scattering * (aerosol_phase * transmittance_to_sun + ms));
195 const float4 step_transmittance =
exp(-dt * extinction);
198 const float4 cut_ext =
max(extinction, 1e-7f);
199 const float4 S_int = (S - S * step_transmittance) / cut_ext;
200 L_inscattering = L_inscattering + transmittance * S_int;
201 transmittance *= step_transmittance;
204 return L_inscattering;
229 float4 &aerosol_absorption,
230 float4 &aerosol_scattering,
231 float4 &molecular_absorption,
232 float4 &molecular_scattering)
const
257 return L_ms + L_ground;
264 const float v =
saturate(normalized_altitude);
267 const int x1 = int(
x);
268 const int y1 = int(
y);
271 const float fx =
x - x1;
272 const float fy =
y - y1;
275 return mix(bottom,
top, fy);
283 const int x1 = int(
x);
286 const float fx =
x - x1;
292 const float v =
saturate(normalized_altitude);
295 const int y1 = int(
y);
297 const float fy =
y - y1;
309 float aerosol_density,
316 altitude =
clamp(altitude, 1.0f, 99999.0f) / 1000.0f;
317 const int half_width = width / 2;
318 const float sun_zenith_cos_angle =
cosf(
M_PI_2_F - sun_elevation);
320 const int rows_per_task = std::max(1024 / width, 1);
324 float *pixel_row = pixels + (
y * width * stride);
325 for (
int x = 0;
x < half_width;
x++) {
328 const float azimuth =
M_2PI_F * uv.
x;
331 const float l = uv.
y * 2.0f - 1.0f;
341 const float t_d = (ground_dist < 0.0f) ? atmos_dist : ground_dist;
346 const int pos_x =
x * stride;
347 pixel_row[pos_x] = sky.
x;
348 pixel_row[pos_x + 1] = sky.
y;
349 pixel_row[pos_x + 2] = sky.
z;
351 const int mirror_x = (width -
x - 1) * stride;
352 pixel_row[mirror_x] = sky.
x;
353 pixel_row[mirror_x + 1] = sky.
y;
354 pixel_row[mirror_x + 2] = sky.
z;
361 float angular_diameter,
364 float aerosol_density,
366 float r_pixel_bottom[3],
367 float r_pixel_top[3])
372 altitude =
clamp(altitude, 1.0f, 99999.0f) / 1000.0f;
373 const float half_angular = angular_diameter / 2.0f;
374 const float solid_angle =
M_2PI_F * (1.0f -
cosf(half_angular));
378 auto get_sun_xyz = [&](
const float elevation) {
379 const float sun_zenith_cos_angle =
cosf(
M_PI_2_F - elevation);
381 normalized_altitude);
385 const float3 bottom = get_sun_xyz(sun_elevation - half_angular);
386 const float3 top = get_sun_xyz(sun_elevation + half_angular);
389 r_pixel_bottom[0] = bottom.
x;
390 r_pixel_bottom[1] = bottom.
y;
391 r_pixel_bottom[2] = bottom.
z;
392 r_pixel_top[0] =
top.x;
393 r_pixel_top[1] =
top.y;
394 r_pixel_top[2] =
top.z;
MINLINE float safe_sqrtf(float a)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
ccl_device_inline float cos_theta(const float3 w)
float4 get_inscattering(const float3 sun_dir, const float3 ray_origin, const float3 ray_dir, const float t_d) const
float4 get_transmittance(const float cos_theta, const float normalized_altitude) const
float4 lookup_transmittance(const float cos_theta, const float normalized_altitude) const
float4 lookup_transmittance_at_ground(const float cos_theta) const
void get_atmosphere_collision_coefficients(const float altitude, float4 &aerosol_absorption, float4 &aerosol_scattering, float4 &molecular_absorption, float4 &molecular_scattering) const
SkyMultipleScattering(const float air_density, const float aerosol_density, const float ozone_density)
float4 lookup_multiscattering(float cos_theta, float normalized_height, float d) const
float4 transmittance_lut[TRANSMITTANCE_RES_Y][TRANSMITTANCE_RES_X]
float4 lookup_transmittance_to_sun(const float normalized_altitude) const
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
constexpr T clamp(T, U, U) RET
void SKY_parallel_for(const size_t begin, const size_t end, const size_t grainsize, const Function &function)
float ray_sphere_intersection(float3 pos, float3 dir, float radius)
float3 sun_direction(float sun_cos_theta)
static const float4 SUN_SPECTRAL_IRRADIANCE
float3 spectral_to_xyz(const float4 L)
static const int IN_SCATTERING_STEPS
static const float4 MOLECULAR_SCATTERING_COEFFICIENT_BASE
void SKY_multiple_scattering_precompute_texture(float *pixels, int stride, int width, int height, float sun_elevation, float altitude, float air_density, float aerosol_density, float ozone_density)
static const int TRANSMITTANCE_RES_Y
static const float RAYLEIGH_PHASE_SCALE
float molecular_phase_function(const float cos_theta)
static const float PHASE_ISOTROPIC
static const int TRANSMITTANCE_RES_X
static const float EARTH_RADIUS
static const float ATMOSPHERE_RADIUS
static const float AEROSOL_BASE_DENSITY
static const float4 GROUND_ALBEDO
static const float3 SPECTRAL_XYZ[4]
float4 get_molecular_absorption_coefficient(const float h)
static const float4 AEROSOL_ABSORPTION_CROSS_SECTION
static const float AEROSOL_HEIGHT_SCALE
static const float4 AEROSOL_SCATTERING_CROSS_SECTION
static const int TRANSMITTANCE_STEPS
float get_aerosol_density(const float h)
static const float OZONE_MEAN_DOBSON
static const float AEROSOL_BACKGROUND_DENSITY
static const float4 OZONE_ABSORPTION_CROSS_SECTION
static const float ATMOSPHERE_THICKNESS
float aerosol_phase_function(const float cos_theta)
float4 get_molecular_scattering_coefficient(const float h)
void SKY_multiple_scattering_precompute_sun(float sun_elevation, float angular_diameter, float altitude, float air_density, float aerosol_density, float ozone_density, float r_pixel_bottom[3], float r_pixel_top[3])
float SKY_earth_intersection_angle(float altitude)