@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
25 lines (23 loc) • 1.11 kB
JavaScript
var shadowVSM8PS = `
float calculateVSM8(vec3 moments, float Z, float vsmBias) {
float VSMBias = vsmBias;
float depthScale = VSMBias * Z;
float minVariance1 = depthScale * depthScale;
return chebyshevUpperBound(moments.xy, Z, minVariance1, 0.1);
}
float decodeFloatRG(vec2 rg) {
return rg.y*(1.0/255.0) + rg.x;
}
float VSM8(TEXTURE_ACCEPT(tex), vec2 texCoords, float resolution, float Z, float vsmBias, float exponent) {
vec4 c = texture2D(tex, texCoords);
vec3 moments = vec3(decodeFloatRG(c.xy), decodeFloatRG(c.zw), 0.0);
return calculateVSM8(moments, Z, vsmBias);
}
float getShadowVSM8(TEXTURE_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams, float exponent, vec3 lightDir) {
return VSM8(TEXTURE_PASS(shadowMap), shadowCoord.xy, shadowParams.x, shadowCoord.z, shadowParams.y, 0.0);
}
float getShadowSpotVSM8(TEXTURE_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams, float exponent, vec3 lightDir) {
return VSM8(TEXTURE_PASS(shadowMap), shadowCoord.xy, shadowParams.x, length(lightDir) * shadowParams.w + shadowParams.z, shadowParams.y, 0.0);
}
`;
export { shadowVSM8PS as default };