Initial commit: Minecraft 光追着色器包(从零实现的 path tracing)
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
// 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
|
||||
Reference in New Issue
Block a user