Use URP Renderer Features in Unity 6
A Renderer Feature adds rendering behavior to a specific URP Renderer. Use Render Objects to redraw filtered objects, Full Screen Pass to apply a material across the camera output, or a custom Scriptable Renderer Feature when the built-in features cannot express the required pass.
Confirm which renderer the camera uses, add one feature, and compare the frame before and after it runs.
- Select the Renderer Data asset used by the target camera.
- Select Add Renderer Feature and configure only the filters and inputs the effect requires.
- Inspect the result with the Render Graph Viewer, Frame Debugger, and a target build.
Do not add URP Renderer Features to a VRChat project. VRChat's project setup documentation says not to use URP or HDRP. Rebuild imported URP effects for Unity's Built-in Render Pipeline and the intended VRChat platform.
Confirm Which Renderer the Camera Uses
A Renderer Feature belongs to a Renderer Data asset. It does not automatically affect every camera or every renderer in the project.
- Select the active URP Asset.
- Inspect its renderer list and default renderer.
- Select the target camera and check whether it overrides the default renderer.
- Open the Renderer Data asset that camera actually uses.
Projects can contain separate renderers for different cameras or quality configurations. Editing an unused Renderer Data asset is a common reason a correctly configured feature appears to do nothing.
Add a Renderer Feature
Unity's editor workflow is:
- Select the Renderer Data asset in the Project window.
- In the Inspector, select Add Renderer Feature.
- Select the feature.
- Configure it in the Renderer Features list.
Unity displays the new Renderer Feature as a child of the renderer asset in the Project window. Give it a name that states its result and scope, such as Draw Characters Behind Walls or Damage Screen Pass.
Select the Smallest Suitable Approach
| Requirement | Use |
|---|---|
| Redraw objects from selected queues, layers, or shader passes | Render Objects |
| Apply a material to the camera image | Full Screen Pass |
| Use URP's built-in SSAO, decals, or screen-space shadows | The corresponding built-in Renderer Feature |
| Create custom raster, compute, or multi-pass behavior | A custom Scriptable Renderer Feature |
| Change one surface only | A material or shader |
| Apply standard Bloom or color grading | URP post-processing and Volumes |
Renderer Features add work to the renderer. Do not introduce a custom pass when a material, Volume override, or built-in feature already supplies the result.
1. Draw Filtered Objects with Render Objects
URP normally draws objects during its opaque and transparent passes. Render Objects redraws a selected set at a chosen point with optional overrides.
Configure:
- Event to select when the pass runs
- Queue for opaque or transparent objects
- Layer Mask to select Unity layers
- Pass Names to select compatible shader passes
- material or shader override when required
- depth and stencil overrides when required
- camera overrides only when the effect needs them
Basic workflow
- Put the intended objects on a dedicated Unity layer.
- Add Render Objects to the active renderer.
- Select the render event and queue.
- Set the Layer Mask to the dedicated layer.
- Configure the minimum required override.
- Test included and excluded objects.
Broad layer masks can redraw far more geometry than intended. Check the Frame Debugger to confirm which objects the pass submits.
2. Apply a Full Screen Pass
Full Screen Pass injects a material-driven fullscreen pass at one of three documented points:
| Injection point | Frame position |
|---|---|
| Before Rendering Transparents | After the skybox and before transparent objects |
| Before Rendering Post Processing | After transparent objects and before URP post-processing |
| After Rendering Post Processing | After post-processing and before URP's AfterRendering passes |
Assign the effect material to Pass Material. If its shader contains multiple passes, enable the feature's advanced properties and select the required Pass Index.
Request only the inputs the shader reads
| Requirement | Result |
|---|---|
| None | Adds no additional input pass |
| Depth | Makes depth values available by adding a depth prepass when needed |
| Normal | Makes normal-vector data available |
| Color | Copies screen color into _BlitTexture |
| Motion | Makes motion vectors available |
| Everything | Requests Depth, Normal, Color, and Motion |
The default Color requirement performs a screen-color copy. Remove it when the material does not sample _BlitTexture, and avoid Everything unless the shader genuinely reads every input.
3. Create a Custom Renderer Feature
Unity 6 uses Render Graph for new URP rendering work. A typical custom implementation includes:
- a
ScriptableRendererFeaturethat owns and enqueues the pass - a
ScriptableRenderPassthat defines the work Create()to initialize the pass and owned resourcesAddRenderPasses()to enqueue itRecordRenderGraph()to declare resources, attachments, and rendering commandsDispose()to release resources owned by the feature
Unity calls AddRenderPasses() once per camera while setting up the renderer. Do not allocate resources there. Filter unwanted camera types before enqueuing the pass.
Inside RecordRenderGraph(), declare what the pass reads and writes. Render Graph can then manage texture lifetimes, avoid creating unused textures, and cull work whose output is not used.
Choose the pass type
| Work | Render Graph API direction |
|---|---|
| Draw rasterized geometry or a fullscreen material | Raster render pass |
| Dispatch a compute shader | Compute pass |
| Use compatibility APIs that Render Graph cannot safely describe | Unsafe pass, with reduced optimization opportunities |
Prefer normal raster or compute passes. Unity warns that unsafe passes can prevent pass merging and other Render Graph optimizations.
Render Graph and Compatibility Mode
Older tutorials often implement custom passes entirely with compatibility-mode APIs such as Execute(), command-buffer blits, and manual render-target setup.
In Unity 6:
- new graphics features should use the Render Graph API
- older non-Render Graph examples require Compatibility Mode (Render Graph Disabled)
- Unity states that it no longer develops or improves the non-Render Graph rendering path
Compatibility Mode can keep an older feature working during migration, but it should not be the starting point for a new Unity 6 renderer feature.
Choose the Injection Point from Required Data
Select the render event based on what must already exist and what must still be drawn:
- Does the pass need opaque objects, the skybox, or transparent objects?
- Should URP post-processing happen before or after the effect?
- Does the pass read depth, normals, color, or motion?
- Must UI or a camera stack remain outside the effect?
- Does the pass write data needed by a later feature?
The wrong injection point can exclude transparent objects, process the image before required data exists, apply an effect twice, or place output behind the wrong geometry.
Limit the Feature to Intended Cameras
AddRenderPasses() applies a custom pass to every camera using that renderer unless the feature filters them. Test:
- Base and Overlay cameras
- Scene view and Game view
- preview and reflection cameras where relevant
- cameras using another renderer
- cameras that should not receive the effect
Use a separate Renderer Data asset when whole groups of cameras need different feature sets. Use explicit camera filtering for conditions that belong in the custom feature itself.
Inspect and Profile the Pass
- Open Window > Analysis > Render Graph Viewer to inspect built-in and custom Render Graph passes.
- Use the Frame Debugger to confirm pass order, draw submissions, attachments, and copies.
- Compare the same camera view with the feature enabled and disabled.
- Capture CPU, GPU, and memory data in a representative target build.
- Test every renderer, camera configuration, graphics API, and platform the application supports.
Check whether requested inputs create extra prepasses or texture copies. A visually simple fullscreen effect can still be expensive at high resolution.
Troubleshooting
Help! The Renderer Feature does not appear.
Confirm the target camera uses the Renderer Data asset you edited. Then check that the feature is active, its material compiles, and its queue, layer, and shader-pass filters include the test object.
Help! The Full Screen Pass affects the wrong part of the frame.
Change the Injection Point according to whether transparent objects and post-processing should be included. Also check the material's blend, depth, and sampling behavior.
Help! Requesting Depth, Normal, or Color reduced performance.
Remove every requirement the shader does not read, then inspect the Render Graph Viewer and Frame Debugger again. Requested inputs can add prepasses, textures, or screen-color copies.
Help! The custom pass runs on preview or Overlay cameras.
Add explicit camera filtering before enqueuing the pass, or assign a different Renderer Data asset to camera groups that need different features. Test every camera type that shares the renderer.
Help! An older renderer feature stopped working in Unity 6.
Determine whether it uses compatibility-mode APIs. Enable Compatibility Mode only as a temporary migration step, consult the upgrade notes for its original URP version, and port new work to RecordRenderGraph().
Help! My Render Graph pass is missing from the final frame.
Confirm that the pass declares its resource reads, writes, and render attachments correctly and that a later pass consumes its output. Render Graph can cull a pass when its output is unused.
Official References
- Unity 6 Manual: Add a Renderer Feature to a URP Renderer
- Unity 6 Manual: Render Objects Renderer Feature Example
- Unity 6 Manual: Full Screen Pass Renderer Feature Reference
- Unity 6 Manual: Custom Rendering Pass Workflow in URP
- Unity 6 Manual: Inject a Render Pass into the URP Frame
- Unity 6 Manual: Scriptable Renderer Feature API Reference
- Unity 6 Manual: Render Graph Viewer
- Unity 6 Manual: Write a Render Pass in Compatibility Mode
- VRChat Creation: Getting Started