Unreal Engine: Mastering Cascaded Shadow Maps and Shadow CVars to Fix Sudden Shadow Blur
Unreal Engine guide to Cascaded Shadow Maps and shadow CVars—understand cascade distribution, resolution, DistanceScale to balance quality and performance.
Introduction
Unreal Engine developers frequently encounter a baffling visual: crisp shadows close to the camera that suddenly soften or blur a few meters out. At the heart of many of these cases are Cascaded Shadow Maps—the technique Unreal Engine uses for large directional lights—and a handful of engine console variables (CVars) and light properties that control how those cascades are allocated, sized, and rendered. Understanding how cascade count, per-cascade resolution, distribution exponent, and global shadow distance settings interact is essential to diagnose abrupt drops in shadow fidelity and to tune the trade-off between visual quality and GPU cost.
Why a shadow looks sharp at one range and soft a short distance away
A common scenario: a directional light casts fine, crisp shadows on an object near the camera, but at about 2–4 meters the shadow suddenly becomes noticeably softer. That abrupt transition is typically caused by a cascade boundary—when the camera’s view moves from one cascaded shadow map to the next, the amount of shadow texel density available for that world slice changes. Because Unreal Engine divides the camera frustum into multiple distance ranges (cascades) and assigns a shadow map to each, the configuration of those cascades determines where quality shifts occur. If a near cascade is small and assigned the maximum CSM resolution, it will appear very sharp; if you widen that near cascade without changing resolution, the same texel budget now covers more world space and the shadow looks blurrier.
Core Unreal Engine CVars that control dynamic shadow behavior
Several CVars exposed by Unreal Engine give global control over dynamic shadow rendering. These are commonly edited in BaseScalability.ini or at runtime through the console and are essential to know when debugging shadow problems.
-
r.Shadow.CSM.MaxCascades — Controls the maximum number of cascades available for cascaded shadow maps. More cascades can improve quality at intermediate and far ranges but increase GPU overhead.
-
r.Shadow.MaxResolution — Sets an upper bound for the resolution used by dynamic shadow maps. Increasing this will sharpen shadows but consumes more memory and potentially more fill-rate.
-
r.Shadow.MaxCSMResolution — Specifically limits the maximum resolution for Directional Light CSMs. This is the direct control for how detailed each cascade’s shadow map can be.
-
r.Shadow.RadiusThreshold — Drops dynamic shadow casting for objects whose projected screen size falls below this threshold. This is useful for performance: tiny distant objects won’t cost shadow draws.
- r.Shadow.DistanceScale — Scales the overall distance at which dynamic shadows are rendered. A larger value extends dynamic shadows further, with proportional cost; a smaller value clamps dynamic shadows closer in.
Each of these CVars modifies broad behavior and often interacts with per-light settings. Changing any one of them can shift the balance of where GPU resources are spent and where visual fidelity changes become visible.
Directional Light settings that directly affect cascade layout
Per-light properties on Unreal Engine’s Directional Light determine how CSMs are constructed for that particular light source. These matter when you need targeted control rather than global scaling.
-
DynamicShadowDistanceStationaryLight — The maximum radius (distance from the camera) within which the directional light will render dynamic cascaded shadows. Beyond this, shadows revert to baked/cached or are absent.
-
DynamicShadowCascades — The number of cascades to generate for the directional light. Typical values are 1–4, where 1 is a single large map and higher values split the view into more slices with per-slice maps.
- CascadeDistributionExponent — The exponent that controls how cascades are distributed across the DynamicShadowDistance. Values are typically between 1.0 and 4.0. Lower values distribute cascades more evenly; higher values concentrate more cascades close to the camera and increase near-field detail at the expense of distant cascades.
Understanding these controls is the key: cascade count and distribution decide where along the camera frustum the boundaries fall, and per-cascade resolution plus the MaxCSMResolution determine the texel density inside each boundary.
How cascade distribution works and why the exponent matters
Think of the camera frustum as a series of nested rings extending outward. Cascaded Shadow Maps split that frustum into range slices, each receiving a shadow texture. The CascadeDistributionExponent shapes how large those slices are.
-
Exponent of 1.0 yields an even spacing across the shadow distance: cascades cover roughly equal ranges.
- Increasing the exponent (for example, to 2.0–4.0) compresses more cascades at the near end of the frustum and allocates fewer to far distances. That boosts near-camera shadow detail but expands the coverage of later cascades.
Two consequences follow immediately: where cascade boundaries occur changes (so the distance at which a quality drop appears will shift), and the per-cascade texel density changes because a fixed texture resolution now spans a different physical distance. If the near cascade grows from 3 meters to 12 meters while keeping the same MaxCSMResolution, its texel density drops roughly fourfold, producing softer shadows in that range, while more resolution becomes available for the closest geometry.
Visualizing cascade boundaries and texel density in the editor
When debugging, use the engine’s visualization tools to reveal cascade splits and texel density. The view modes and shadow visualization options will show where cascade boundaries are located and how densely texels map to world space. Visual inspection helps correlate visible blur with cascade edges—if the blur starts exactly where a split is drawn, your problem is cascade configuration, not shadow filtering or geometry.
Practical verification steps:
- Enable CSM visualization to see split boundaries.
- Use the Scene Capture or a debug view mode that overlays shadow map resolution.
- Temporarily increase MaxCSMResolution to check whether the blurriness is simply resolution-starvation.
- Adjust the CascadeDistributionExponent and observe how split distances move and which cascades gain or lose texel density.
Common trade-offs: resolution vs. coverage
Real-time shadowing is fundamentally a resource allocation problem. Each CSM texture has a fixed resolution. If you increase the distance a cascade must cover without also raising its texture resolution, texel density falls and shadows soften. Therefore, the core trade-offs are:
-
More cascades: better ability to concentrate texels where needed, but higher render cost and more textures to manage.
-
Higher MaxCSMResolution: improved per-cascade fidelity, at the cost of GPU memory and potential fill-rate impact.
-
Compressed distribution (higher exponent): sharper shadows for near-field geometry, softer shadows farther away.
- Increased DynamicShadowDistance (or r.Shadow.DistanceScale): extends dynamic shadowing but spreads resources more thinly if other parameters remain unchanged.
Choosing sensible defaults depends on platform: mobile and VR require stricter limits, consoles and high-end PC allow more generous budgets. For small scenes or close-camera scenarios (e.g., a vehicle-focused shot), concentrate resolution nearby; for open-world scenes, distribute resources more evenly.
Scalability groups and the temptation of a quick fix
BaseScalability.ini exposes group-based shadow settings (Low, Medium, High, Epic, Cinematic) and many teams will reflexively bump the shadow quality setting for the relevant group to solve a visual issue. That can work, but it’s a blunt instrument. Increasing r.Shadow.DistanceScale or MaxCSMResolution at a global level fixes the symptom but may push GPU cost beyond your target budget in other situations.
Instead, consider targeted changes:
- Adjust the Directional Light’s DynamicShadowDistanceStationaryLight for the specific level or actor types that need it.
- Tune CascadeDistributionExponent to move the cascade boundary away from the area where you need crisp shadows.
- For a single problematic object (like a vehicle), consider enabling per-object shadow biasing or a proximate static shadow to complement CSMs.
Scalability groups remain useful for platform-specific fallbacks, but identifying the root cause delivers a more efficient fix.
A practical debugging checklist for shadow blur
When you encounter sudden shadow softening in Unreal Engine, work through this sequence:
-
Reproduce and visualize: Enable the CSM visualization modes and confirm whether the blur aligns with a cascade boundary.
-
Inspect Directional Light properties: Note DynamicShadowDistanceStationaryLight, DynamicShadowCascades, and CascadeDistributionExponent.
-
Check global CVars: Look in BaseScalability.ini and with the console for r.Shadow.* values (DistanceScale, MaxCSMResolution, etc.).
-
Temporarily adjust MaxCSMResolution: If raising it reduces blur, the problem is resolution-limited; measure cost impact.
-
Modify CascadeDistributionExponent incrementally: Moving the exponent down or up will shift where the proximal cascade ends—watch how the perceived blur distance moves.
-
Test with different camera distances and FOVs: Cascade behavior is camera-dependent; cinematics or gameplay cameras with narrow FOVs call for different tuning than wide-open gameplay views.
-
Profile performance: Use GPU profiling to confirm the cost of any solution; don’t trade a visual fix for an unacceptable frame-time increase.
- Consider alternate shadowing approaches: If cascaded maps can’t satisfy the design (for example, in very large open worlds or where near-field contact shadows are needed), evaluate virtual shadow maps, ray-traced shadows, or localized contact shadow techniques.
Who should be involved when shadow issues arise
Shadow tuning bridges rendering engineers, technical artists, and level designers. Rendering engineers should own global CVars and engine-level behavior. Technical artists tune per-light settings, per-level overrides, and provide visualization and documentation. Level designers and environment artists need to understand how camera placement and composition expose cascade boundaries so they can plan geometry and lighting accordingly. For large teams, document a standard set of shadow profiles (mobile, console, cinematic) and the recommended settings for Directional Lights, cascade exponents, and MaxCSMResolution.
How these choices affect gameplay, art pipelines, and build pipelines
-
Gameplay UX: Sudden visual changes (like a visible shadow quality cliff near a vehicle) can break immersion. Where gameplay involves close inspection of objects, prioritize near-field shadow fidelity.
-
Art pipeline: When artists author assets, they should be aware of cascade boundaries and texel density. If an asset is consistently crossing a cascade edge, artists can provide baked or stationary shadowing, or adjust UV/lightmap setups to compensate.
- Build and runtime pipelines: Scalability configurations must be applied consistently across builds. If you rely on per-platform BaseScalability.ini changes, include those overrides in your build pipeline to avoid surprises when shipping.
Industry context: where CSMs sit relative to modern shadow tech
Cascaded Shadow Maps remain a widely used technique for real-time directional shadows because they balance quality and cost, especially for large scenes lit by a sun. However, newer approaches such as virtual shadow maps and hardware ray tracing offer alternative trade-offs: virtual shadow maps can provide stable texel density and reduce cascade boundary artifacts, while ray tracing can produce physically accurate soft shadows at the cost of higher GPU requirements or hybrid solutions. Unreal Engine’s own global illumination and shadowing systems (Lumen, virtual shadow maps, and hardware-accelerated ray tracing) change the landscape, but CSMs are still relevant for many projects and platforms.
When evaluating alternatives, consider:
-
Platform targets: mobile platforms often cannot afford ray tracing; consoles with RTX support may be able to adopt hybrid ray-traced shadows selectively.
-
Artist control vs. automation: techniques like virtual shadow maps can reduce manual tuning, while CSMs give explicit control over cascade distribution.
- Tooling and pipelines: migrating to a different system involves pipeline changes, QA, and new profiling targets.
Integrations and adjacent toolsets to consider
Tuning shadows does not happen in isolation. Profiling tools (GPU profilers, Unreal Insights) and scene-visualization utilities are essential. Automation and CI systems should include render tests that flag large regressions in shadow fidelity. AI-assisted tools are emerging that can help detect visual anomalies in renders; for instance, automated visual regression tools and ML-based denoisers can reduce the need for brute-force sampling in ray-traced solutions. Developer tools, content management systems, and production tracking (the kinds of systems a studio manages in its development pipeline) all play a role in enforcing and auditing shadow settings across levels.
Best practices to avoid future surprise artifacts
-
Document the rationale for any CVar or per-light override in your project repository and link it to platform-specific profiles.
-
Use level-specific overrides rather than global increases when possible. A scene that requires deeper dynamic shadows should own its settings.
-
Maintain a standard set of visualization checks in your QA pipeline to catch cascade-boundary artifacts early.
-
Treat cascade distribution as part of composition: camera placement influences how cascades are perceived, so cinematic and gameplay cameras may require different settings.
-
Profile performance impacts for each change. Shadow tuning is easy to over-optimize visually at the cost of thermal, power, or frame-rate issues.
- Consider a hybrid approach: use CSMs for broad directional shadowing, but overlay localized contact shadows, screen-space techniques, or baked shadows to handle problematic near-field cases.
Industry implications for developers and businesses
Mastering shadow tuning in Unreal Engine is both a technical and a production challenge. Studios that standardize their shadow profiles and teach artists how to read and adjust cascade-related settings will save time and avoid costly rework. For smaller teams or indie developers, knowing where to look (Directional Light settings, CSM visualizers, BaseScalability.ini CVars) shortens the debugging cycle and reduces reliance on heavy-handed fixes that degrade performance. On the business side, delivering consistent visual quality across platforms often requires platform-targeted scalability, and opaque fixes (like globally increasing MaxCSMResolution) can inflate hardware requirements and complicate certification or power budgets.
Forward-looking paragraph
As rendering hardware and real-time techniques evolve, the landscape of shadowing will continue to diversify: virtual shadow maps and hybrid ray-traced approaches promise smoother transitions and higher fidelity without manual cascade tuning, while AI-assisted tooling may automate detection and correction of cascade-related artifacts. Meanwhile, practical mastery of Cascaded Shadow Maps and the associated Unreal Engine CVars remains essential—understanding the mechanics lets teams choose when to adopt newer technologies, how to integrate them into existing pipelines, and how to preserve performance across the wide variety of devices games target today.




















