UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

61 lines (60 loc) 3.51 kB
var clusteredLightShadows_default = ` fn _getShadowCoordPerspZbuffer(shadowMatrix: mat4x4f, shadowParams: vec4f, wPos: vec3f) -> vec3f { var projPos = shadowMatrix * vec4f(wPos, 1.0); return projPos.xyz / projPos.w; } fn getShadowCoordPerspZbufferNormalOffset(shadowMatrix: mat4x4f, shadowParams: vec4f, normal: vec3f) -> vec3f { let wPos: vec3f = vPositionW + normal * shadowParams.y; return _getShadowCoordPerspZbuffer(shadowMatrix, shadowParams, wPos); } fn normalOffsetPointShadow(shadowParams: vec4f, lightPos: vec3f, lightDir: vec3f, lightDirNorm: vec3f, normal: vec3f) -> vec3f { let distScale: f32 = length(lightDir); let wPos: vec3f = vPositionW + normal * shadowParams.y * clamp(1.0 - dot(normal, -lightDirNorm), 0.0, 1.0) * distScale; let dir: vec3f = wPos - lightPos; return dir; } #if defined(CLUSTER_SHADOW_TYPE_PCF1) fn getShadowOmniClusteredPCF1(shadowMap: texture_depth_2d, shadowMapSampler: sampler_comparison, shadowParams: vec4f, omniAtlasViewport: vec3f, shadowEdgePixels: f32, lightDir: vec3f) -> f32 { let shadowTextureResolution: f32 = shadowParams.x; let uv: vec2f = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir); let shadowZ: f32 = length(lightDir) * shadowParams.w + shadowParams.z; return textureSampleCompareLevel(shadowMap, shadowMapSampler, uv, shadowZ); } #endif #if defined(CLUSTER_SHADOW_TYPE_PCF3) fn getShadowOmniClusteredPCF3(shadowMap: texture_depth_2d, shadowMapSampler: sampler_comparison, shadowParams: vec4f, omniAtlasViewport: vec3f, shadowEdgePixels: f32, lightDir: vec3f) -> f32 { let shadowTextureResolution: f32 = shadowParams.x; let uv: vec2f = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir); let shadowZ: f32 = length(lightDir) * shadowParams.w + shadowParams.z; let shadowCoord: vec3f = vec3f(uv, shadowZ); return getShadowPCF3x3(shadowMap, shadowMapSampler, shadowCoord, shadowParams); } #endif #if defined(CLUSTER_SHADOW_TYPE_PCF5) fn getShadowOmniClusteredPCF5(shadowMap: texture_depth_2d, shadowMapSampler: sampler_comparison, shadowParams: vec4f, omniAtlasViewport: vec3f, shadowEdgePixels: f32, lightDir: vec3f) -> f32 { let shadowTextureResolution: f32 = shadowParams.x; let uv: vec2f = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir); let shadowZ: f32 = length(lightDir) * shadowParams.w + shadowParams.z; let shadowCoord: vec3f = vec3f(uv, shadowZ); return getShadowPCF5x5(shadowMap, shadowMapSampler, shadowCoord, shadowParams); } #endif #if defined(CLUSTER_SHADOW_TYPE_PCF1) fn getShadowSpotClusteredPCF1(shadowMap: texture_depth_2d, shadowMapSampler: sampler_comparison, shadowCoord: vec3f, shadowParams: vec4f) -> f32 { return textureSampleCompareLevel(shadowMap, shadowMapSampler, shadowCoord.xy, shadowCoord.z); } #endif #if defined(CLUSTER_SHADOW_TYPE_PCF3) fn getShadowSpotClusteredPCF3(shadowMap: texture_depth_2d, shadowMapSampler: sampler_comparison, shadowCoord: vec3f, shadowParams: vec4f) -> f32 { return getShadowSpotPCF3x3(shadowMap, shadowMapSampler, shadowCoord, shadowParams); } #endif #if defined(CLUSTER_SHADOW_TYPE_PCF5) fn getShadowSpotClusteredPCF5(shadowMap: texture_depth_2d, shadowMapSampler: sampler_comparison, shadowCoord: vec3f, shadowParams: vec4f) -> f32 { return getShadowPCF5x5(shadowMap, shadowMapSampler, shadowCoord, shadowParams); } #endif `; export { clusteredLightShadows_default as default };