1
0
Fork 0
fgdata/Shaders/HDR/stars.frag
Fernando García Liñán 7b0211031a HDR: Improve stars rendering
Previously we did not take into account the atmospheric transmittance
to render the stars, leading to stars being incorrectly rendered in
low visibility conditions.

Also place the stars in the correct render bin.
2024-01-07 16:18:55 +01:00

52 lines
1.6 KiB
GLSL

#version 330 core
layout(location = 0) out vec4 fragColor;
in VS_OUT {
vec4 color;
vec3 view_vector;
} fs_in;
uniform sampler2D transmittance_tex;
uniform float max_radiance;
uniform float fg_CameraDistanceToEarthCenter;
uniform float fg_EarthRadius;
uniform vec3 fg_CameraViewUp;
const float ATMOSPHERE_RADIUS = 6471e3;
// exposure.glsl
vec3 apply_exposure(vec3 color);
void main()
{
vec3 color = fs_in.color.rgb * fs_in.color.a * max_radiance;
vec3 V = normalize(fs_in.view_vector);
// Apply aerial perspective
float normalized_altitude =
(fg_CameraDistanceToEarthCenter - fg_EarthRadius)
/ (ATMOSPHERE_RADIUS - fg_EarthRadius);
float cos_theta = dot(-V, fg_CameraViewUp);
vec2 uv = vec2(cos_theta * 0.5 + 0.5, clamp(normalized_altitude, 0.0, 1.0));
vec4 transmittance = texture(transmittance_tex, uv);
// The proper thing would be to have spectral data for the stars' radiance.
// This could be approximated by taking the star's temperature and using
// Plank's law to obtain the spectral radiance for our 4 wavelengths.
// That's too complicated for now, so instead we just average the four
// spectral samples from the atmospheric transmittance.
color *= dot(transmittance, vec4(0.25));
// Pre-expose
color = apply_exposure(color);
// Final color = transmittance * star radiance + sky inscattering
// In this frag shader we output the multiplication part, and the sky
// in-scattering is added by doing additive blending on top of the skydome.
fragColor = vec4(color, 1.0);
}