Quick answer: URP Render Graph culls passes whose outputs nothing else reads. Declare your written resource as a real graph output (or call builder.AllowPassCulling(false) for side-effect passes).

A custom Render Graph pass writes to a texture and runs fine in isolation, but in the full pipeline it never executes — the graph decided it was dead code.

The Graph Prunes Dead Passes

Render Graph builds a dependency graph and culls any pass whose outputs aren’t consumed. If your pass writes to a texture that nothing downstream reads, the graph correctly (from its view) skips it.

Make the Output Used

If the pass result should feed later passes, declare the dependency: have the consuming pass take your texture as an input via builder.UseTexture. The graph then keeps your pass alive because something needs it.

Side-Effect Passes: Disable Culling

using (var builder = renderGraph.AddRasterRenderPass<PassData>("My Pass", out var passData))
{
    builder.AllowPassCulling(false);   // pass has side effects the graph can't see
    // ...
}

For passes whose “output” is something the graph doesn’t track (writing to a persistent RT, a compute buffer used next frame), disable culling explicitly.

Don't Disable It Everywhere

Culling is a feature — it skips work that genuinely isn’t needed. Only opt out for true side-effect passes; for normal passes, fix the dependency declaration instead.

Verifying

The pass runs every frame as expected. The Render Graph Viewer shows it in the executed list with its dependencies wired up.

“Render Graph culls unused passes. Declare the dependency, or opt out for side-effect passes.”

Use the Render Graph Viewer window — it shows exactly which passes were culled and why, far faster than guessing.