shadowVisibility.glsl 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. float czm_private_shadowVisibility(float visibility, float nDotL, float normalShadingSmooth, float darkness)
  2. {
  3. #ifdef USE_NORMAL_SHADING
  4. #ifdef USE_NORMAL_SHADING_SMOOTH
  5. float strength = clamp(nDotL / normalShadingSmooth, 0.0, 1.0);
  6. #else
  7. float strength = step(0.0, nDotL);
  8. #endif
  9. visibility *= strength;
  10. #endif
  11. visibility = max(visibility, darkness);
  12. return visibility;
  13. }
  14. #ifdef USE_CUBE_MAP_SHADOW
  15. float czm_shadowVisibility(samplerCube shadowMap, czm_shadowParameters shadowParameters)
  16. {
  17. float depthBias = shadowParameters.depthBias;
  18. float depth = shadowParameters.depth;
  19. float nDotL = shadowParameters.nDotL;
  20. float normalShadingSmooth = shadowParameters.normalShadingSmooth;
  21. float darkness = shadowParameters.darkness;
  22. vec3 uvw = shadowParameters.texCoords;
  23. depth -= depthBias;
  24. float visibility = czm_shadowDepthCompare(shadowMap, uvw, depth);
  25. return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness);
  26. }
  27. #else
  28. float czm_shadowVisibility(sampler2D shadowMap, czm_shadowParameters shadowParameters)
  29. {
  30. float depthBias = shadowParameters.depthBias;
  31. float depth = shadowParameters.depth;
  32. float nDotL = shadowParameters.nDotL;
  33. float normalShadingSmooth = shadowParameters.normalShadingSmooth;
  34. float darkness = shadowParameters.darkness;
  35. vec2 uv = shadowParameters.texCoords;
  36. depth -= depthBias;
  37. #ifdef USE_SOFT_SHADOWS
  38. vec2 texelStepSize = shadowParameters.texelStepSize;
  39. float radius = 1.0;
  40. float dx0 = -texelStepSize.x * radius;
  41. float dy0 = -texelStepSize.y * radius;
  42. float dx1 = texelStepSize.x * radius;
  43. float dy1 = texelStepSize.y * radius;
  44. float visibility = (
  45. czm_shadowDepthCompare(shadowMap, uv, depth) +
  46. czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy0), depth) +
  47. czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy0), depth) +
  48. czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy0), depth) +
  49. czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, 0.0), depth) +
  50. czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, 0.0), depth) +
  51. czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy1), depth) +
  52. czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy1), depth) +
  53. czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy1), depth)
  54. ) * (1.0 / 9.0);
  55. #else
  56. float visibility = czm_shadowDepthCompare(shadowMap, uv, depth);
  57. #endif
  58. return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness);
  59. }
  60. #endif