// MinecraftPT — Sunlight & Shadow // Direct sunlight with RTWSM warped shadow map sampling and voxel shadow tracing. #ifndef SUNLIGHT_SHADOW_GLSL #define SUNLIGHT_SHADOW_GLSL #include "/Lib/RTWSM/SampleWarp.glsl" #include "/Lib/BasicFunctions/LightingConstants.glsl" // Sample the warped shadow map float SampleShadowMap(vec3 shadowPos){ vec2 shadowCoord = shadowPos.xy * 0.5 + 0.5; vec3 shadowUv = vec3(UnshiftShadowScreenPos(shadowCoord), shadowPos.z * 0.5 + 0.5); float shadow = 0.0; float depth = shadowUv.z; #ifdef SHADOW_QUALITY #if SHADOW_QUALITY >= 2 // 3x3 PCF for (int i = -1; i <= 1; i++){ for (int j = -1; j <= 1; j++){ vec2 sampleCoord = shadowUv.xy + vec2(i, j) * shadowPixelSize; shadow += step(texelFetch(shadowcolor0, ivec2(sampleCoord * shadowSize), 0).a, depth) * (1.0 / 9.0); }} #else shadow = step(texelFetch(shadowcolor0, ivec2(shadowUv.xy * shadowSize), 0).a, depth); #endif #else shadow = step(texelFetch(shadowcolor0, ivec2(shadowUv.xy * shadowSize), 0).a, depth); #endif return shadow; } // Full sunlight evaluation: shadow map + optional voxel shadow tracing float GetSunShadow(vec3 viewPos, vec3 worldPos, vec3 vertexNormal, float lightmap){ float shadow = 1.0; #ifdef PT_SHADOW vec3 shadowDir = normalize(shadowModelViewInverse2); shadow = ShadowTracing(viewPos, worldPos, vertexNormal, shadowDir, lightmap); #else // Shadow map path vec4 shadowPos = shadowProjection * shadowModelView * vec4(worldPos, 1.0); if (shadowPos.w > 0.0){ vec3 shadowNdc = shadowPos.xyz / shadowPos.w; if (all(lessThan(abs(shadowNdc.xy), vec2(1.0)))){ shadow = SampleShadowMap(shadowNdc); } } #endif return shadow; } // Direct sun light for a surface vec3 GetSunlight(vec3 viewPos, vec3 worldPos, vec3 vertexNormal, vec3 worldNormal, float lightmap){ float shadow = GetSunShadow(viewPos, worldPos, vertexNormal, lightmap); float NdotL = max(dot(worldNormal, GetSunDirWorld()), 0.0); vec3 sunColor = GetSunIrradiance(); #ifdef COLORED_SHADOWS // Sample shadow albedo for colored shadows (subtle) vec3 shadowAlbedo = vec3(0.0); sunColor *= 1.0 - shadowAlbedo * 0.3; #endif return sunColor * shadow * NdotL; } #endif