Files

72 lines
2.2 KiB
GLSL

// 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