16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-18 23:49:19 +02:00
Files
maszyna/betterRenderer/shaders/manul/sky_transmittance.hlsl
2025-04-15 01:32:56 +02:00

41 lines
1.2 KiB
HLSL

#include "sky_common.hlsli"
#define TRANSMITTANCE_STEPS 32
float4 main(in float2 uv : Position) : SV_Target0
{
float sun_cos_theta = uv.x * 2.0 - 1.0;
float3 sun_dir = float3(-sqrt(1.0 - sun_cos_theta*sun_cos_theta), 0.0, sun_cos_theta);
float distance_to_earth_center = lerp(EARTH_RADIUS, ATMOSPHERE_RADIUS, uv.y);
float3 ray_origin = float3(0.0, 0.0, distance_to_earth_center);
float t_d = ray_sphere_intersection(ray_origin, sun_dir, ATMOSPHERE_RADIUS);
float dt = t_d / float(TRANSMITTANCE_STEPS);
float4 result = 0.0;
for (int i = 0; i < TRANSMITTANCE_STEPS; ++i) {
float t = (float(i) + 0.5) * dt;
float3 x_t = ray_origin + sun_dir * t;
float altitude = length(x_t) - EARTH_RADIUS;
float4 aerosol_absorption, aerosol_scattering;
float4 molecular_absorption, molecular_scattering;
float4 fog_scattering;
float4 extinction;
get_atmosphere_collision_coefficients(
altitude,
aerosol_absorption, aerosol_scattering,
molecular_absorption, molecular_scattering,
fog_scattering,
extinction);
result += extinction * dt;
}
float4 transmittance = exp(-result);
return transmittance;
}