playcanvas
Version:
PlayCanvas WebGL game engine
57 lines (54 loc) • 2.26 kB
JavaScript
var shadowPCF3PS = `
float _getShadowPCF3x3(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 sum = 0.0;
float uw0 = (3.0 - 2.0 * s);
float uw1 = (1.0 + 2.0 * s);
float u0 = (2.0 - s) / uw0 - 1.0;
float u1 = s / uw1 + 1.0;
float vw0 = (3.0 - 2.0 * t);
float vw1 = (1.0 + 2.0 * t);
float v0 = (2.0 - t) / vw0 - 1.0;
float v1 = t / vw1 + 1.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;
sum += uw0 * vw0 * textureShadow(shadowMap, vec3(u0, v0, z));
sum += uw1 * vw0 * textureShadow(shadowMap, vec3(u1, v0, z));
sum += uw0 * vw1 * textureShadow(shadowMap, vec3(u0, v1, z));
sum += uw1 * vw1 * textureShadow(shadowMap, vec3(u1, v1, z));
sum *= 1.0f / 16.0;
return sum;
}
float getShadowPCF3x3(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {
return _getShadowPCF3x3(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams.xyz);
}
float getShadowSpotPCF3x3(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {
return _getShadowPCF3x3(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams.xyz);
}
#ifndef WEBGPU
float getShadowOmniPCF3x3(samplerCubeShadow shadowMap, vec4 shadowParams, vec3 dir) {
float shadowZ = length(dir) * shadowParams.w + shadowParams.z;
float z = 1.0 / float(textureSize(shadowMap, 0));
vec3 tc = normalize(dir);
mediump vec4 shadows;
shadows.x = texture(shadowMap, vec4(tc + vec3( z, z, z), shadowZ));
shadows.y = texture(shadowMap, vec4(tc + vec3(-z,-z, z), shadowZ));
shadows.z = texture(shadowMap, vec4(tc + vec3(-z, z,-z), shadowZ));
shadows.w = texture(shadowMap, vec4(tc + vec3( z,-z,-z), shadowZ));
return dot(shadows, vec4(0.25));
}
float getShadowOmniPCF3x3(samplerCubeShadow shadowMap, vec3 shadowCoord, vec4 shadowParams, vec3 lightDir) {
return getShadowOmniPCF3x3(shadowMap, shadowParams, lightDir);
}
#endif
`;
export { shadowPCF3PS as default };