@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
110 lines (108 loc) • 5.35 kB
JavaScript
var clusteredLightShadowsPS = `
void _getShadowCoordPerspZbuffer(mat4 shadowMatrix, vec4 shadowParams, vec3 wPos) {
vec4 projPos = shadowMatrix * vec4(wPos, 1.0);
projPos.xyz /= projPos.w;
dShadowCoord = projPos.xyz;
}
void getShadowCoordPerspZbufferNormalOffset(mat4 shadowMatrix, vec4 shadowParams, vec3 normal) {
vec3 wPos = vPositionW + normal * shadowParams.y;
_getShadowCoordPerspZbuffer(shadowMatrix, shadowParams, wPos);
}
vec3 normalOffsetPointShadow(vec4 shadowParams, vec3 lightPos, inout vec3 lightDir, vec3 lightDirNorm, vec3 normal) {
float distScale = length(lightDir);
vec3 wPos = vPositionW + normal * shadowParams.y * clamp(1.0 - dot(normal, -lightDirNorm), 0.0, 1.0) * distScale;
vec3 dir = wPos - lightPos;
return dir;
}
float getShadowOmniClusteredPCF1(SHADOWMAP_ACCEPT(shadowMap), vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {
float shadowTextureResolution = shadowParams.x;
vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);
float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;
return textureShadow(shadowMap, vec3(uv, shadowZ));
}
float getShadowOmniClusteredPCF3(SHADOWMAP_ACCEPT(shadowMap), vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {
float shadowTextureResolution = shadowParams.x;
vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);
float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;
vec3 shadowCoord = vec3(uv, shadowZ);
return getShadowPCF3x3(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams);
}
float getShadowOmniClusteredPCF5(SHADOWMAP_ACCEPT(shadowMap), vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {
float shadowTextureResolution = shadowParams.x;
vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);
float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;
vec3 shadowCoord = vec3(uv, shadowZ);
return getShadowPCF5x5(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams);
}
float getShadowOmniClusteredPCF1(sampler2D shadowMap, vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {
float shadowTextureResolution = shadowParams.x;
vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);
float depth = unpackFloat(textureShadow(shadowMap, uv));
float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;
return depth > shadowZ ? 1.0 : 0.0;
}
float getShadowOmniClusteredPCF3(sampler2D shadowMap, vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {
float shadowTextureResolution = shadowParams.x;
vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);
float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;
vec3 shadowCoord = vec3(uv, shadowZ);
return getShadowPCF3x3(shadowMap, shadowCoord, shadowParams);
}
float getShadowOmniClusteredPCF5(sampler2D shadowMap, vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {
float shadowTextureResolution = shadowParams.x;
vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);
float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;
vec3 shadowCoord = vec3(uv, shadowZ);
return getShadowPCF3x3(shadowMap, shadowCoord, shadowParams);
}
float getShadowSpotClusteredPCF1(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {
return textureShadow(shadowMap, shadowCoord);
}
float getShadowSpotClusteredPCF3(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {
return getShadowSpotPCF3x3(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams);
}
float getShadowSpotClusteredPCF5(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {
return getShadowPCF5x5(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams);
}
float getShadowSpotClusteredPCF1(sampler2D shadowMap, vec3 shadowCoord, vec4 shadowParams) {
float depth = unpackFloat(textureShadow(shadowMap, shadowCoord.xy));
return depth > shadowCoord.z ? 1.0 : 0.0;
}
float getShadowSpotClusteredPCF3(sampler2D shadowMap, vec3 shadowCoord, vec4 shadowParams) {
return getShadowSpotPCF3x3(shadowMap, shadowCoord, shadowParams);
}
float getShadowSpotClusteredPCF5(sampler2D shadowMap, vec3 shadowCoord, vec4 shadowParams) {
return getShadowSpotPCF3x3(shadowMap, shadowCoord, shadowParams);
}
`;
export { clusteredLightShadowsPS as default };