72 lines
2.2 KiB
GLSL
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 |