playcanvas
Version:
PlayCanvas WebGL game engine
34 lines (31 loc) • 1.19 kB
JavaScript
var shadowCascadesPS = `
int getShadowCascadeIndex(vec4 shadowCascadeDistances, int shadowCascadeCount) {
float depth = 1.0 / gl_FragCoord.w;
vec4 comparisons = step(shadowCascadeDistances, vec4(depth));
int cascadeIndex = int(dot(comparisons, vec4(1.0)));
return min(cascadeIndex, shadowCascadeCount - 1);
}
int ditherShadowCascadeIndex(int cascadeIndex, vec4 shadowCascadeDistances, int shadowCascadeCount, float blendFactor) {
if (cascadeIndex < shadowCascadeCount - 1) {
float currentRangeEnd = shadowCascadeDistances[cascadeIndex];
float transitionStart = blendFactor * currentRangeEnd;
float depth = 1.0 / gl_FragCoord.w;
if (depth > transitionStart) {
float transitionFactor = smoothstep(transitionStart, currentRangeEnd, depth);
float dither = fract(sin(dot(gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453);
if (dither < transitionFactor) {
cascadeIndex += 1;
}
}
}
return cascadeIndex;
}
vec3 fadeShadow(vec3 shadowCoord, vec4 shadowCascadeDistances) {
float depth = 1.0 / gl_FragCoord.w;
if (depth > shadowCascadeDistances.w) {
shadowCoord.z = -9999999.0;
}
return shadowCoord;
}
`;
export { shadowCascadesPS as default };