#version 330 core layout(location = 0) out vec3 out_inscatter; layout(location = 1) out vec3 out_transmittance; in vec2 texCoord; uniform mat4 fg_ViewMatrixInverse; uniform vec3 fg_CameraPositionCart; uniform vec3 fg_CameraPositionGeod; uniform vec3 fg_SunDirectionWorld; uniform vec2 fg_NearFar; const float TOTAL_SLICES = 16.0; const float DEPTH_RANGE = 32000.0; vec3 positionFromDepth(vec2 pos, float depth); void calculateScattering(in vec3 rayOrigin, in vec3 rayDir, in float tmax, in vec3 lightDir, in float earthRadius, out vec3 inscatter, out vec3 transmittance); void main() { float x = texCoord.x * TOTAL_SLICES; vec2 coord = vec2(fract(x), texCoord.y); float depth = mix(fg_NearFar.x, DEPTH_RANGE, ceil(x) / TOTAL_SLICES); vec3 fragPos = positionFromDepth(coord * 2.0 - 1.0, 0.0); vec3 rayDir = vec4(fg_ViewMatrixInverse * vec4(normalize(fragPos), 0.0)).xyz; float earthRadius = length(fg_CameraPositionCart) - fg_CameraPositionGeod.z; vec3 inscatter, transmittance; calculateScattering(fg_CameraPositionCart, rayDir, depth, fg_SunDirectionWorld, earthRadius, inscatter, transmittance); out_inscatter = inscatter; out_transmittance = transmittance; }