Inject a render pass with a Scriptable Renderer Feature in URP
Write a class that inherits ScriptableRendererFeature, and use it to creates an instance of the custom render pass you created, and insert the custom render pass into the rendering pipeline.
Read time 2 minutesLast updated a month ago
Use the API to insert a Scriptable Render Pass into the Universal Render Pipeline (URP) frame rendering loop.
ScriptableRenderFeatureFollow these steps:
-
Create a new C# script.
-
Replace the code with a class that inherits from theclass.
ScriptableRendererFeatureusing UnityEngine;using UnityEngine.Rendering.Universal;public class MyRendererFeature : ScriptableRendererFeature{} -
In the class, override themethod. For example:
Createpublic override void Create(){}URP calls themethods on the following events:Create- When the Scriptable Renderer Feature loads the first time.
- When you enable or disable the Scriptable Renderer Feature.
- When you change a property in the window of the Renderer Feature.Inspector
?
-
In themethod, create an instance of your Scriptable Render Pass, and inject it into the renderer.
CreateFor example, if you have a Scriptable Render Pass called:RedTintRenderPass// Define an instance of the Scriptable Render Passprivate RedTintRenderPass redTintRenderPass;public override void Create(){ // Create an instance of the Scriptable Render Pass redTintRenderPass = new RedTintRenderPass(); // Inject the render pass after rendering the skybox redTintRenderPass.renderPassEvent = RenderPassEvent.AfterRenderingSkybox;}You can also use themethod to initialize any other resources the Scriptable Renderer Feature needs, such as materials.Create -
Override themethod.
AddRenderPassespublic override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){}URP calls themethod every frame, once for each camera. Don't create or instantiate any resources within this method.AddRenderPasses -
Use theAPI to inject the Scriptable Render Pass into the frame rendering loop.
EnqueuePasspublic override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){ renderer.EnqueuePass(redTintRenderPass);}To add a render pass to a specific camera only, use anstatement to check the camera type. For example:ifif (renderingData.cameraData.cameraType == CameraType.Game){ renderer.EnqueuePass(redTintRenderPass);}
You can now add the Scriptable Renderer Feature to the active URP asset. Refer to How to add a Renderer Feature to a Renderer for more information.
To dispose of any resources, override the method.
DisposeExample
For a complete example of a Scriptable Renderer Feature with a custom render pass that uses a material to blit, follow these steps:
- Import the URP render graph samples. For more information, refer to Importing a package sample in URP.
- In the Project window, go to Samples > Universal Render Pipeline > <your version> > URP RenderGraph Samples > BlitWithMaterial.