Stop re-rendering shadows that never change.
URP redraws every shadow map every frame, even for lights and geometry that haven't moved. Your buildings, your street lamps, the sun. All of it gets rasterized again from scratch, frame after frame. That's why point lights feel unaffordable (each one is six shadow renders), why you end up turning shadows off on half your lights, and why a third shadowed lamp can sink a mobile or VR build.
──────────────────────────────────────────────────
How it works
H_CachedShadows takes over URP's shadow passes and binds its own persistent shadow atlas into URP's shader globals. Your Lit shaders keep sampling shadows exactly as before and never know the map is cached. A light re-renders only when it actually changes: it moves, its range or angle changes, it toggles, or you invalidate it yourself. Not on a timer, not because you looked away. Wander a level as long as you like and the static lights never redraw.
──────────────────────────────────────────────────
Performance
With static lights sitting still, shadow rendering drops to a texture bind. The rasterization doesn't happen; the pass hands your shaders an atlas that's already in VRAM and gets out of the way. While Dynamic Caster Composite is on you still pay for:
• the small screen rectangles your moving objects occupy (this scales with your movers, not your light count)
• one extra shadow atlas in memory
• the sun re-rendering when the camera travels a long way (see Limitations)
──────────────────────────────────────────────────
Why the dynamic shadows stay cheap
The awkward part of caching shadows is that getting a moving character into a cached map normally means re-rendering the map, which throws the cache away. That's why "cached shadows" and "characters that cast shadows" usually means picking one.
This asset keeps two atlases. The cache holds your static world, rendered once and then left alone. The composite is a copy of the cache with your movers drawn on top, and it's the one your shaders sample. The static shadows in the cache are never redrawn.
The composite update stays small. Each frame it only touches the lights a mover is physically inside, and for a point light only the one or two cube faces the mover falls in, not all six. Inside each of those it copies back just the rectangle the mover's shadow covers and redraws that. Everything else keeps last frame's pixels. A scene with 200 cached lamps and one walking player redraws a handful of small rectangles a frame instead of 200 shadow maps.
The cost is one extra shadow atlas in memory, at whatever resolution you already use. In return your static shadows stay pixel-identical and effectively free while your characters cast correct, moving shadows on top of them. The sun works the same way per cascade: the cascade the player's standing in gets the live overlay, the far ones stay frozen.
──────────────────────────────────────────────────
Features
◆ Point, spot and directional lights. Forward, Forward+ and Deferred+.
◆ Two caching modes, mirrored across light types. Point and spot use Cache and hold or Manual; the sun uses Cached Cascades or Manual.
◆ URP Config Forker (optional). One click raises URP's shadow slots cap from 256 to 512 and the shadow atlas resolution from 8K to 16K, when you have the VRAM for it.
◆ Automatic per-light invalidation. Move a lamp and its shadow updates; nothing else re-renders. No timers, no refresh calls.
◆ Camera-independent point/spot caching. The lamps don't care where the player is looking, they will be cached once and then reused.
◆ Live dynamic shadows composited on top of the cache, per cube face, per rectangle, per cascade.
◆ Stable atlas slots. Each light keeps a permanent slot, so its pixels survive between frames.
◆ The same lights URP would shadow. The keep-set follows URP's own priority order, so toggling the asset doesn't change which lights get shadows.
◆ Amortised refreshes. Big updates spread over a few frames instead of spiking, wi
Description sourced from the Unity Asset Store listing.