playcanvas
Version:
PlayCanvas WebGL game engine
4 lines (2 loc) • 3.33 kB
JavaScript
var clusteredLightShadowsPS = "\n// Clustered Omni Sampling using atlas\n\nvec3 _getShadowCoordPerspZbuffer(mat4 shadowMatrix, vec4 shadowParams, vec3 wPos) {\n vec4 projPos = shadowMatrix * vec4(wPos, 1.0);\n projPos.xyz /= projPos.w;\n return projPos.xyz;\n // depth bias is already applied on render\n}\n\nvec3 getShadowCoordPerspZbufferNormalOffset(mat4 shadowMatrix, vec4 shadowParams, vec3 normal) {\n vec3 wPos = vPositionW + normal * shadowParams.y;\n return _getShadowCoordPerspZbuffer(shadowMatrix, shadowParams, wPos);\n}\n\nvec3 normalOffsetPointShadow(vec4 shadowParams, vec3 lightPos, inout vec3 lightDir, vec3 lightDirNorm, vec3 normal) {\n float distScale = length(lightDir);\n vec3 wPos = vPositionW + normal * shadowParams.y * clamp(1.0 - dot(normal, -lightDirNorm), 0.0, 1.0) * distScale; //0.02\n vec3 dir = wPos - lightPos;\n return dir;\n}\n\n#if defined(CLUSTER_SHADOW_TYPE_PCF1)\n\nfloat getShadowOmniClusteredPCF1(SHADOWMAP_ACCEPT(shadowMap), vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {\n\n float shadowTextureResolution = shadowParams.x;\n vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);\n\n float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;\n return textureShadow(shadowMap, vec3(uv, shadowZ));\n}\n\n#endif\n\n#if defined(CLUSTER_SHADOW_TYPE_PCF3)\n\nfloat getShadowOmniClusteredPCF3(SHADOWMAP_ACCEPT(shadowMap), vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {\n\n float shadowTextureResolution = shadowParams.x;\n vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);\n\n float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;\n vec3 shadowCoord = vec3(uv, shadowZ);\n return getShadowPCF3x3(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams);\n}\n\n#endif\n\n#if defined(CLUSTER_SHADOW_TYPE_PCF5)\n\nfloat getShadowOmniClusteredPCF5(SHADOWMAP_ACCEPT(shadowMap), vec4 shadowParams, vec3 omniAtlasViewport, float shadowEdgePixels, vec3 lightDir) {\n\n float shadowTextureResolution = shadowParams.x;\n vec2 uv = getCubemapAtlasCoordinates(omniAtlasViewport, shadowEdgePixels, shadowTextureResolution, lightDir);\n\n float shadowZ = length(lightDir) * shadowParams.w + shadowParams.z;\n vec3 shadowCoord = vec3(uv, shadowZ);\n return getShadowPCF5x5(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams);\n}\n\n#endif\n\n// Clustered Spot Sampling using atlas\n\n#if defined(CLUSTER_SHADOW_TYPE_PCF1)\n\nfloat getShadowSpotClusteredPCF1(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {\n return textureShadow(shadowMap, shadowCoord);\n}\n\n#endif\n\n#if defined(CLUSTER_SHADOW_TYPE_PCF3)\n\nfloat getShadowSpotClusteredPCF3(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {\n return getShadowSpotPCF3x3(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams);\n}\n\n#endif\n\n#if defined(CLUSTER_SHADOW_TYPE_PCF5)\n\nfloat getShadowSpotClusteredPCF5(SHADOWMAP_ACCEPT(shadowMap), vec3 shadowCoord, vec4 shadowParams) {\n return getShadowPCF5x5(SHADOWMAP_PASS(shadowMap), shadowCoord, shadowParams);\n}\n#endif\n";
export { clusteredLightShadowsPS as default };