H CachedShadows for URP (Lighting Performance) View on Asset Store (opens in new tab)

Package details

Latest version
1.8
Last updated
First released
Unity version
6000.6.0 or later
Package size
146.6 MB
Files
171
Favorites
26
Views in the past week
41

Price tracking

Last checked
Tracked since
Lowest recorded
$14.99 on

Keywords

H CachedShadows for URP (Lighting Performance)

by H Assets - H Works Interactive (opens in new tab)

5.0 / 5 · 9 ratings

Ratings by stars
Number of ratings for each star rating
5 stars 9
4 stars 0
3 stars 0
2 stars 0
1 star 0

H Cached Shadows caches your URP shadow maps once and reuse them every frame. Static lights cost nothing, moving characters still cast live shadows blended on top. Forward, Forward+ and Deferred+.

Price $29.99

Buy on Asset Store (opens in new tab)

Affiliate link · Purchases support this site

Price history

Last 6 months

USD
Price history for H CachedShadows for URP (Lighting Performance), 6 months Current $29.99; lowest $14.99; highest $29.99 in this period. $0 $25 $50 Sep Oct Nov Version 1.1 released 24 Aug 2026 v1.1 Version 1.3 released 4 Sep 2026 v1.3 Version 1.6 released 7 Sep 2026 Version 1.8 released 26 Oct 2026 v1.8

Asset preview

1 / 9

H CachedShadows for URP (Lighting Performance) screenshot 1

H CachedShadows for URP (Lighting Performance) screenshot 1

About this asset

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. 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, an object next to it switches LOD, 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. In the demo's release build (RTX 5070, 1080p):

• the demo scene goes from 6.6 ms a frame uncached to 1.26 ms cached

• with the moving-object stress test on, 6.7 ms to 1.9 ms

• walking through 1,024 LOD Groups, 7.4 ms to 1.9 ms

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)

• the lights around a LOD Group when it switches LOD, and the sun at most twice a second

• the sun re-rendering when the camera travels a long way (see Limitations)

──────────────────────────────────────────────────

Why the dynamic shadows stay cheap

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 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. A scene with 200 cached lamps and one walking player redraws a handful of small rectangles a frame instead of 200 shadow maps.

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.

──────────────────────────────────────────────────

Shadows that follow your LODs

A cached shadow is a snapshot of whatever LOD the object showed when it was drawn, so walk up to a tree and you could see the shadow of its distant LOD or impostor under the full mesh.

LOD Tracking (on by default) fixes that. The cache follows every LOD Group the way the main camera sees it, with Unity's own selection rule, cross-fades included. When a group settles on another LOD the shadow on the ground changes with it: only the point and spot lights around it redraw, and the sun refreshes at most twice a second. A LOD with Cast Shadows off leaves no shadow, and following 4,000 LOD Groups costs about 0.03 ms a frame in a build.

For trees whose near LODs sway in the wind, put a LOD Shadow Caster on the LOD Group and choose how many LODs are live (LOD0 by default). While the tree shows a live LOD its shadow is drawn every frame, so the wind keeps moving it; once it drops to a farther LOD it goes back into the cache. A forest costs what its nearest trees cost.

──────────────────────────────────────────────────

Features

◆ Point, spot and directional lights. Forward, Forward+ and Deferred+, and VR with Single Pass Instanced.

◆ Two caching modes. Point and spot use Cache and hold or Manual; the sun uses Cached Cascades or Manual.

◆ LOD Tracking. Cached shadows follow every LOD Group, mesh LODs and impostors alike.

◆ LOD Shadow Caster. Live shadows for the nearest LODs, cached shadows for the rest.

◆ Realtime Shadows Light. Keep chosen lights out of the cache, like a flashlight.

◆ Redraw only what you name. InvalidateLight and InvalidateLights redraw just those lights, InvalidateBounds just the lights whose range touches a box.

◆ URP Config Forker (optional). One click doubles URP's shadow slots to 512 and the atlas to 16K (see Limitations).

◆ 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.

◆ Stable atlas slots. Each light keeps a permanent slot, so its pixels survive between frames. When the atlas is full, the light off screen longest gives its slot up first.

◆ The same lights URP would shadow. Toggling the asset doesn't change which lights get shadows.

◆ Amortised refreshes. Big updates spread over a few frames instead of spiking, with a tunable budget.

◆ Built-in statistics. A once-a-second line shows what was redrawn and why.

◆ Optional shared settings asset to drive several renderers from one place.

◆ RenderGraph, Unity 6 / URP 17+. Full C# source, no DLLs.

──────────────────────────────────────────────────

Setup

1. Add the render feature to your Universal Renderer.

2. Put the Dynamic Shadow Caster component on anything that moves (on the root; children are automatic). Swaying foliage gets the LOD Shadow Caster, a flashlight gets the Realtime Shadows Light.

3. Ship it.

──────────────────────────────────────────────────

Limitations

• Classic Deferred can't cache point and spot shadows. URP resolves those inside its own shadow pass using an internal light index that only exists while the pass runs, and this asset replaces the pass, so there's nothing for the cache to hook into. The asset detects it, hands point and spot back to URP so they still render (uncached), and locks the toggle off in the inspector with an explanation. The sun still caches. Deferred+ is one dropdown away and caches everything.

• The sun re-renders when the camera moves far. URP builds directional cascades around the camera, so a cached cascade is only valid while the camera stays near where it was cached. In Cached Cascades mode it re-fits after a few metres of travel or a few degrees of rotation and holds otherwise; Manual never re-fits on its own. This is how cascades work, and HDRP's cached shadows carry the same caveat. But don't worry, this is much faster than actually rendering the directional shadows every frame. Point and spot lights have no such limit, they will be cached once and then held.

• Everything that moves needs the component. Anything without a Dynamic Shadow Caster counts as static, so if it moves, its shadow freezes where it was first cached (or call InvalidateBounds when you move it once). Animated meshes without the component get a warning that names them, so you won't ship it by accident. The asset manages Renderer.staticShadowCaster, so don't repurpose that flag.

• LOD Tracking follows Unity's own LOD choice. LODGroup.ForceLOD isn't followed, and LOD Groups spawned or changed with SetLODs at run time are picked up by Auto Rescan Scene or one InvalidateAll(true) call.

• URP caps shadowed lights at 256, and this asset ships the fix. A point light costs 6 shadow atlas slices and a spot costs 1, so stock URP gives you roughly 42 point lights or 256 spots shadow slots at once. And if your lamps only shine downward, spots stretch the same budget six times further than points. The included H URP Config Forker doubles that ceiling to 512 and raises the shadow atlas from 8K to 16K with one click, giving you 4 times more shadow space, for far more lights and sharper shadows when you have the VRAM.

──────────────────────────────────────────────────

Good to know

• Dynamic Caster Composite is play-mode only and uses a second shadow atlas. The LOD Shadow Caster needs it on.

• Composite mode needs additional light shadows enabled on your URP asset.

• Live LODs and Realtime Shadows Lights cost what URP would charge to draw them.

• LOD Tracking works in every update mode, Manual included; switch it off for full manual control.

• Unity 6+ / URP 17+ with RenderGraph, tested on Unity 6.3 and 6.6.

──────────────────────────────────────────────────

Built for our own game

This wasn't written as a tech demo. Silent Strike is our in-development tactical shooter and the reason the asset exists: heavily lit interiors, a lamp on every pillar, weapon flashlights, and a shadow budget stock URP couldn't pay. The Realtime Shadows Light and the per-light redraws came straight out of it. You can see it running in the video above.

It's been stress-tested against 150+ shadow-casting lights at once and 1,024 LOD Groups, debugged in real player builds, not just the editor, and checked on Deferred+, Forward+ and Forward, with the GPU Resident Drawer on and off, until each behaved the same. The per-frame cost stays inside a 1 ms budget. Every limitation above was found in a real scene and written down instead of hidden.

──────────────────────────────────────────────────

See for yourself

The demo has the moving-object stress test, a 1,024 LOD Group stress test, LOD test slabs and the flashlight, all switchable from the debug window. Download the demo here.

──────────────────────────────────────────────────

Support

Documentation & Full Changelog: https://hworksinteractive.com/hassets/hcachedshadows

Support email: [email protected]

Discord: https://hworksinteractive.com/discordinvite

From the publisher's Asset Store listing.

Compatibility

Render pipelines supported in each Unity version
Unity version Built-in URP HDRP
6000.6.0f1 Not listed Compatible Not listed

As listed on the Asset Store.