Write a Scriptable Render Pass in URP
To create a Scriptable Render Pass in the Universal Render Pipeline (URP), follow these steps:
Create a C# script that inherits the
ScriptableRenderPass
class. For example:using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class ExampleRenderPass : ScriptableRenderPass { }
In the class, add variables for the materials and textures you use in the render pass.
For example, the following code sets up a handle to a texture, and a descriptor to configure the texture.
private RTHandle textureHandle; private RenderTextureDescriptor textureDescriptor;
Override the
Configure
method to set up the render pass. Unity calls this method before executing the render pass.For example:
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { //Set the texture size to be the same as the camera target size. textureDescriptor.width = cameraTextureDescriptor.width; textureDescriptor.height = cameraTextureDescriptor.height; //Check if the descriptor has changed, and reallocate the texture handle if necessary. RenderingUtils.ReAllocateIfNeeded(ref textureHandle, textureDescriptor); }
Override the
Execute
method with your rendering commands. Unity calls this method every frame, once for each camera.For example:
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { // Get a CommandBuffer from pool CommandBuffer cmd = CommandBufferPool.Get(); // Add rendering commands to the CommandBuffer ... // Execute the command buffer and release it back to the pool context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); }
Inject a render pass into the render loop
To inject a render pass into the render loop, refer to the following:
For a complete example, refer to Example of a complete Scriptable Renderer Feature.