playcanvas
Version:
PlayCanvas WebGL game engine
52 lines (50 loc) • 2.03 kB
JavaScript
var shadowPCF5PS = `
float _getShadowPCF5x5(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec3 shadowParams) {
float z = shadowCoord.z;
vec2 uv = shadowCoord.xy * shadowParams.x;
float shadowMapSizeInv = 1.0 / shadowParams.x;
vec2 base_uv = floor(uv + 0.5);
float s = (uv.x + 0.5 - base_uv.x);
float t = (uv.y + 0.5 - base_uv.y);
base_uv -= vec2(0.5);
base_uv *= shadowMapSizeInv;
float uw0 = (4.0 - 3.0 * s);
float uw1 = 7.0;
float uw2 = (1.0 + 3.0 * s);
float u0 = (3.0 - 2.0 * s) / uw0 - 2.0;
float u1 = (3.0 + s) / uw1;
float u2 = s / uw2 + 2.0;
float vw0 = (4.0 - 3.0 * t);
float vw1 = 7.0;
float vw2 = (1.0 + 3.0 * t);
float v0 = (3.0 - 2.0 * t) / vw0 - 2.0;
float v1 = (3.0 + t) / vw1;
float v2 = t / vw2 + 2.0;
float sum = 0.0;
u0 = u0 * shadowMapSizeInv + base_uv.x;
v0 = v0 * shadowMapSizeInv + base_uv.y;
u1 = u1 * shadowMapSizeInv + base_uv.x;
v1 = v1 * shadowMapSizeInv + base_uv.y;
u2 = u2 * shadowMapSizeInv + base_uv.x;
v2 = v2 * shadowMapSizeInv + base_uv.y;
sum += uw0 * vw0 * textureShadow(shadowMap, vec3(u0, v0, z));
sum += uw1 * vw0 * textureShadow(shadowMap, vec3(u1, v0, z));
sum += uw2 * vw0 * textureShadow(shadowMap, vec3(u2, v0, z));
sum += uw0 * vw1 * textureShadow(shadowMap, vec3(u0, v1, z));
sum += uw1 * vw1 * textureShadow(shadowMap, vec3(u1, v1, z));
sum += uw2 * vw1 * textureShadow(shadowMap, vec3(u2, v1, z));
sum += uw0 * vw2 * textureShadow(shadowMap, vec3(u0, v2, z));
sum += uw1 * vw2 * textureShadow(shadowMap, vec3(u1, v2, z));
sum += uw2 * vw2 * textureShadow(shadowMap, vec3(u2, v2, z));
sum *= 1.0f / 144.0;
sum = saturate(sum);
return sum;
}
float getShadowPCF5x5(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {
return _getShadowPCF5x5(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams.xyz);
}
float getShadowSpotPCF5x5(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {
return _getShadowPCF5x5(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams.xyz);
}
`;
export { shadowPCF5PS as default };