Quick answer: URP 17+ uses Render Graph. Acquire camera color via UniversalResourceData.activeColorTexture, blit through your material, write back to active color.

A custom CRT-style post-process renderer feature renders nothing in builds. URP’s legacy Blit API is deprecated; the new Render Graph requires explicit resource handling.

Render Graph Pass

public class CRTPass : ScriptableRenderPass
{
    Material material;

    public override void RecordRenderGraph(RenderGraph rg, ContextContainer ctx)
    {
        var resources = ctx.Get<UniversalResourceData>();
        var src = resources.activeColorTexture;
        var dst = rg.CreateTexture(src.GetDescriptor(rg));

        RenderGraphUtils.BlitMaterialParameters p = new(src, dst, material, 0);
        rg.AddBlitPass(p, "CRT Effect");

        resources.SetActiveColorTexture(dst);
    }
}

Get source, create dest, blit, swap active. RG manages allocations and aliasing.

Inject Point

Renderer Feature’s ScriptableRenderPass → renderPassEvent. For full-screen effects post Post-Processing: BeforeRenderingPostProcessing or AfterRenderingPostProcessing.

Material Setup

Material’s shader must use TEXTURE2D macros (not legacy sampler2D) and HLSL TEMPLATE blits. Use Unity’s URP Blit shader template.

Check Renderer Asset

The Renderer Feature must be added to the Forward Renderer used by your URP asset. Forward Renderer → Renderer Features list → add your feature.

Verifying

Camera shows CRT effect. Toggle feature on/off; effect respects. Frame Debugger shows the Blit pass inserted at expected event.

“Render Graph is URP’s future. Get the active target, blit, set back — that’s the new dance.”

Reference Unity’s URP samples in Package Manager for boilerplate — copy-paste, adapt, ship.