precision highp float; precision highp sampler3D; #define RECIPROCAL_PI (0.3183098861837907) #include "core/raySphereIntersection" #include "parameters" #include "functions" #include "sky" uniform vec3 sunDirection; uniform vec3 moonDirection; uniform float moonAngularRadius; uniform float lunarRadianceScale; uniform vec3 groundAlbedo; #ifdef HAS_SHADOW_LENGTH uniform sampler2D shadowLengthBuffer; #endif // HAS_SHADOW_LENGTH in vec2 vUv; in vec3 vCameraPosition; in vec3 vRayDirection; in vec3 vEllipsoidCenter; layout(location = 0) out vec4 outputColor; #include bool rayIntersectsGround(const vec3 cameraPosition, const vec3 rayDirection) { float r = length(cameraPosition); float mu = dot(cameraPosition, rayDirection) / r; return mu < 0.0 && r * r * (mu * mu - 1.0) + u_bottom_radius * u_bottom_radius >= 0.0; } void main() { float shadowLength = 0.0; #ifdef HAS_SHADOW_LENGTH shadowLength = texture(shadowLengthBuffer, vUv).r; #endif // HAS_SHADOW_LENGTH vec3 cameraPosition = vCameraPosition - vEllipsoidCenter; vec3 rayDirection = normalize(vRayDirection); #ifdef GROUND_ALBEDO bool intersectsGround = rayIntersectsGround(cameraPosition, rayDirection); if (intersectsGround) { float distanceToGround = raySphereFirstIntersection( cameraPosition, rayDirection, u_bottom_radius ); vec3 groundPosition = rayDirection * distanceToGround + cameraPosition; vec3 surfaceNormal = normalize(groundPosition); vec3 skyIrradiance; vec3 sunIrradiance = GetSunAndSkyIrradiance( cameraPosition, surfaceNormal, sunDirection, skyIrradiance ); vec3 transmittance; vec3 inscatter = GetSkyRadianceToPoint( cameraPosition, u_bottom_radius * surfaceNormal, shadowLength, sunDirection, transmittance ); vec3 radiance = groundAlbedo * RECIPROCAL_PI * (sunIrradiance + skyIrradiance); outputColor.rgb = radiance * transmittance + inscatter; } else { outputColor.rgb = getSkyRadiance( cameraPosition, rayDirection, shadowLength, sunDirection, moonDirection, moonAngularRadius, lunarRadianceScale ); } #else // GROUND_ALBEDO outputColor.rgb = getSkyRadiance( cameraPosition, rayDirection, shadowLength, sunDirection, moonDirection, moonAngularRadius, lunarRadianceScale ); #endif // GROUND_ALBEDO outputColor.a = 1.0; #include }