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.

Add One Feature to the Active Renderer

Confirm which renderer the camera uses, add one feature, and compare the frame before and after it runs.

  1. Select the Renderer Data asset used by the target camera.
  2. Select Add Renderer Feature and configure only the filters and inputs the effect requires.
  3. Inspect the result with the Render Graph Viewer, Frame Debugger, and a target build.
VRChat note

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.

  1. Select the active URP Asset.
  2. Inspect its renderer list and default renderer.
  3. Select the target camera and check whether it overrides the default renderer.
  4. 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:

  1. Select the Renderer Data asset in the Project window.
  2. In the Inspector, select Add Renderer Feature.
  3. Select the feature.
  4. 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

  1. Put the intended objects on a dedicated Unity layer.
  2. Add Render Objects to the active renderer.
  3. Select the render event and queue.
  4. Set the Layer Mask to the dedicated layer.
  5. Configure the minimum required override.
  6. 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 ScriptableRendererFeature that owns and enqueues the pass
  • a ScriptableRenderPass that defines the work
  • Create() to initialize the pass and owned resources
  • AddRenderPasses() to enqueue it
  • RecordRenderGraph() to declare resources, attachments, and rendering commands
  • Dispose() 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

  1. Open Window > Analysis > Render Graph Viewer to inspect built-in and custom Render Graph passes.
  2. Use the Frame Debugger to confirm pass order, draw submissions, attachments, and copies.
  3. Compare the same camera view with the feature enabled and disabled.
  4. Capture CPU, GPU, and memory data in a representative target build.
  5. 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

Continue Learning