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.