I tried to create a custom render pass following the guide on the official documentation. When I follow the exact steps I end up with a Script that looks like this:
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEngine.Rendering.RenderGraphModule;
using Unity.VisualScripting;
using UnityEngine.Rendering.RenderGraphModule.Util;
using System;
public class CustomPixelPerfectPass : ScriptableRendererFeature
{
class PixelPerfectRenderPass : ScriptableRenderPass
{
private RenderTextureDescriptor pixelPerfectTextureDescriptor;
private CustomPixelPerfectPassSettings defaultSettings;
private Material material;
static readonly int pixelSizeID = Shader.PropertyToID("_PixelSize");
private const string k_PixelPerfectTextureName = "_BlurTexture";
public PixelPerfectRenderPass(Material material, CustomPixelPerfectPassSettings defaultSettings) {
this.material = material;
this.defaultSettings = defaultSettings;
pixelPerfectTextureDescriptor = new RenderTextureDescriptor(Screen.width, Screen.height, RenderTextureFormat.Default, 0);
}
// RecordRenderGraph is where the RenderGraph handle can be accessed, through which render passes can be added to the graph.
// FrameData is a context container through which URP resources can be accessed and managed.
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
const string k_pixelPerfectPassName = "Render Pixel Perfect Pass";
// Use this scope to set the required inputs and outputs of the pass and to
// setup the passData with the required properties needed at pass execution time.
// Make use of frameData to access resources and camera data through the dedicated containers.
// Eg:
// UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
if (resourceData.isActiveTargetBackBuffer)
return;
pixelPerfectTextureDescriptor.width = cameraData.cameraTargetDescriptor.width;
pixelPerfectTextureDescriptor.height = cameraData.cameraTargetDescriptor.height;
pixelPerfectTextureDescriptor.depthBufferBits = 0;
TextureHandle srcCamColor = resourceData.activeColorTexture;
TextureHandle dst = UniversalRenderer.CreateRenderGraphTexture(renderGraph, pixelPerfectTextureDescriptor, k_PixelPerfectTextureName, false);
// Update the blur settings in the material
UpdatePixelPerfectSettings();
// This check is to avoid an error from the material preview in the scene
if (!srcCamColor.IsValid() || !dst.IsValid())
return;
RenderGraphUtils.BlitMaterialParameters paraVertical = new(srcCamColor, dst, material, 0);
renderGraph.AddBlitPass(paraVertical, k_pixelPerfectPassName);
}
private void UpdatePixelPerfectSettings() {
if (material == null)
return;
var volumeComponent = VolumeManager.instance.stack.GetComponent<CustomPixelPerfectVolumeComponent>();
float pixelSize = volumeComponent.pixelSize.overrideState ?
volumeComponent.pixelSize.value : defaultSettings.pixelSize;
material.SetFloat(pixelSizeID, pixelSize);
}
}
[SerializeField] private CustomPixelPerfectPassSettings settings;
[SerializeField] private Shader shader;
private Material material;
private PixelPerfectRenderPass pixelPerfectRenderPass;
/// <inheritdoc/>
public override void Create() {
if (shader == null) {
return;
}
material = new Material(shader);
pixelPerfectRenderPass = new PixelPerfectRenderPass(material, settings);
pixelPerfectRenderPass.renderPassEvent = RenderPassEvent.AfterRenderingSkybox;
}
// Here you can inject one or multiple render passes in the renderer.
// This method is called when setting up the renderer once per-camera.
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (pixelPerfectRenderPass == null) {
return;
}
if (renderingData.cameraData.cameraType == CameraType.Game) {
renderer.EnqueuePass(pixelPerfectRenderPass);
}
}
protected override void Dispose(bool disposing) {
if (Application.isPlaying) {
Destroy(material);
} else {
DestroyImmediate(material);
}
}
}
[System.Serializable]
public class CustomPixelPerfectPassSettings {
public float pixelSize = 2;
}
[Serializable]
public class CustomPixelPerfectVolumeComponent : VolumeComponent {
public ClampedFloatParameter pixelSize =
new ClampedFloatParameter(2, 1, 32);
}
When you create a custom renderer feature you get a default script that looks like this though:
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEngine.Rendering.RenderGraphModule;
public class ExamplePassFeature : ScriptableRendererFeature
{
class CustomRenderPass : ScriptableRenderPass
{
// This class stores the data needed by the RenderGraph pass.
// It is passed as a parameter to the delegate function that executes the RenderGraph pass.
private class PassData
{
}
// This static method is passed as the RenderFunc delegate to the RenderGraph render pass.
// It is used to execute draw commands.
static void ExecutePass(PassData data, RasterGraphContext context)
{
}
// RecordRenderGraph is where the RenderGraph handle can be accessed, through which render passes can be added to the graph.
// FrameData is a context container through which URP resources can be accessed and managed.
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
const string passName = "Render Custom Pass";
// This adds a raster render pass to the graph, specifying the name and the data type that will be passed to the ExecutePass function.
using (var builder = renderGraph.AddRasterRenderPass<PassData>(passName, out var passData))
{
// Use this scope to set the required inputs and outputs of the pass and to
// setup the passData with the required properties needed at pass execution time.
// Make use of frameData to access resources and camera data through the dedicated containers.
// Eg:
// UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
// Setup pass inputs and outputs through the builder interface.
// Eg:
// builder.UseTexture(sourceTexture);
// TextureHandle destination = UniversalRenderer.CreateRenderGraphTexture(renderGraph, cameraData.cameraTargetDescriptor, "Destination Texture", false);
// This sets the render target of the pass to the active color texture. Change it to your own render target as needed.
builder.SetRenderAttachment(resourceData.activeColorTexture, 0);
// Assigns the ExecutePass function to the render pass delegate. This will be called by the render graph when executing the pass.
builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context));
}
}
// NOTE: This method is part of the compatibility rendering path, please use the Render Graph API above instead.
// This method is called before executing the render pass.
// It can be used to configure render targets and their clear state. Also to create temporary render target textures.
// When empty this render pass will render to the active camera render target.
// You should never call CommandBuffer.SetRenderTarget. Instead call <c>ConfigureTarget</c> and <c>ConfigureClear</c>.
// The render pipeline will ensure target setup and clearing happens in a performant manner.
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
}
// NOTE: This method is part of the compatibility rendering path, please use the Render Graph API above instead.
// Here you can implement the rendering logic.
// Use <c>ScriptableRenderContext</c> to issue drawing commands or execute command buffers
// https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.html
// You don't have to call ScriptableRenderContext.submit, the render pipeline will call it at specific points in the pipeline.
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
}
// NOTE: This method is part of the compatibility rendering path, please use the Render Graph API above instead.
// Cleanup any allocated resources that were created during the execution of this render pass.
public override void OnCameraCleanup(CommandBuffer cmd)
{
}
}
CustomRenderPass m_ScriptablePass;
/// <inheritdoc/>
public override void Create()
{
m_ScriptablePass = new CustomRenderPass();
// Configures where the render pass should be injected.
m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
}
// Here you can inject one or multiple render passes in the renderer.
// This method is called when setting up the renderer once per-camera.
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(m_ScriptablePass);
}
}
Now, the first one I tried just does nothing while when I try to combine them like this:
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEngine.Rendering.RenderGraphModule;
using Unity.VisualScripting;
using UnityEngine.Rendering.RenderGraphModule.Util;
using System;
public class CustomPixelPerfectPass : ScriptableRendererFeature
{
class PixelPerfectRenderPass : ScriptableRenderPass
{
// This class stores the data needed by the RenderGraph pass.
// It is passed as a parameter to the delegate function that executes the RenderGraph pass.
private class PassData
{
}
private RenderTextureDescriptor pixelPerfectTextureDescriptor;
private CustomPixelPerfectPassSettings defaultSettings;
private Material material;
static readonly int pixelSizeID = Shader.PropertyToID("_PixelSize");
private const string k_PixelPerfectTextureName = "_BlurTexture";
public PixelPerfectRenderPass(Material material, CustomPixelPerfectPassSettings defaultSettings) {
this.material = material;
this.defaultSettings = defaultSettings;
pixelPerfectTextureDescriptor = new RenderTextureDescriptor(Screen.width, Screen.height, RenderTextureFormat.Default, 0);
}
// This static method is passed as the RenderFunc delegate to the RenderGraph render pass.
// It is used to execute draw commands.
static void ExecutePass(PassData data, RasterGraphContext context)
{
}
// RecordRenderGraph is where the RenderGraph handle can be accessed, through which render passes can be added to the graph.
// FrameData is a context container through which URP resources can be accessed and managed.
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) {
const string k_pixelPerfectPassName = "Render Pixel Perfect Pass";
// Use this scope to set the required inputs and outputs of the pass and to
// setup the passData with the required properties needed at pass execution time.
using (var builder = renderGraph.AddRasterRenderPass<PassData>(k_pixelPerfectPassName, out var passData))
{
// Make use of frameData to access resources and camera data through the dedicated containers.
// Eg:
// UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
if (resourceData.isActiveTargetBackBuffer)
return;
pixelPerfectTextureDescriptor.width = cameraData.cameraTargetDescriptor.width;
pixelPerfectTextureDescriptor.height = cameraData.cameraTargetDescriptor.height;
pixelPerfectTextureDescriptor.depthBufferBits = 0;
TextureHandle srcCamColor = resourceData.activeColorTexture;
TextureHandle dst = UniversalRenderer.CreateRenderGraphTexture(renderGraph, pixelPerfectTextureDescriptor, k_PixelPerfectTextureName, false);
// Update the blur settings in the material
UpdatePixelPerfectSettings();
// This check is to avoid an error from the material preview in the scene
if (!srcCamColor.IsValid() || !dst.IsValid())
return;
RenderGraphUtils.BlitMaterialParameters paraVertical = new(srcCamColor, dst, material, 0);
renderGraph.AddBlitPass(paraVertical, k_pixelPerfectPassName);
builder.SetRenderAttachment(resourceData.activeColorTexture, 0);
// Assigns the ExecutePass function to the render pass delegate. This will be called by the render graph when executing the pass.
builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context));
}
}
private void UpdatePixelPerfectSettings() {
if (material == null)
return;
var volumeComponent = VolumeManager.instance.stack.GetComponent<CustomPixelPerfectVolumeComponent>();
float pixelSize = volumeComponent.pixelSize.overrideState ?
volumeComponent.pixelSize.value : defaultSettings.pixelSize;
material.SetFloat(pixelSizeID, pixelSize);
}
}
[SerializeField] private CustomPixelPerfectPassSettings settings;
[SerializeField] private Shader shader;
private Material material;
private PixelPerfectRenderPass pixelPerfectRenderPass;
/// <inheritdoc/>
public override void Create() {
if (shader == null) {
return;
}
material = new Material(shader);
pixelPerfectRenderPass = new PixelPerfectRenderPass(material, settings);
pixelPerfectRenderPass.renderPassEvent = RenderPassEvent.AfterRenderingSkybox;
}
// Here you can inject one or multiple render passes in the renderer.
// This method is called when setting up the renderer once per-camera.
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (pixelPerfectRenderPass == null) {
return;
}
if (renderingData.cameraData.cameraType == CameraType.Game) {
renderer.EnqueuePass(pixelPerfectRenderPass);
}
}
protected override void Dispose(bool disposing) {
if (Application.isPlaying) {
Destroy(material);
} else {
DestroyImmediate(material);
}
}
}
[System.Serializable]
public class CustomPixelPerfectPassSettings {
public float pixelSize = 2;
}
[Serializable]
public class CustomPixelPerfectVolumeComponent : VolumeComponent {
public ClampedFloatParameter pixelSize =
new ClampedFloatParameter(2, 1, 32);
}
I get the following errors:
Exception: Please finish building the previous pass first by disposing the pass builder object before adding a new pass.
UnityEngine.Rendering.RenderGraphModule.RenderGraphBuilders.Setup (UnityEngine.Rendering.RenderGraphModule.RenderGraphPass renderPass, UnityEngine.Rendering.RenderGraphModule.RenderGraphResourceRegistry resources, UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph) (at ./Library/PackageCache/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilders.cs:47)
UnityEngine.Rendering.RenderGraphModule.RenderGraph.AddUnsafePass[PassData] (System.String passName, PassData& passData, UnityEngine.Rendering.ProfilingSampler sampler, System.String file, System.Int32 line) (at ./Library/PackageCache/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs:1079)
UnityEngine.Rendering.RenderGraphModule.RenderGraph.AddUnsafePass[PassData] (System.String passName, PassData& passData, System.String file, System.Int32 line) (at ./Library/PackageCache/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs:1043)
UnityEngine.Rendering.RenderGraphModule.Util.RenderGraphUtils.AddBlitPass (UnityEngine.Rendering.RenderGraphModule.RenderGraph graph, UnityEngine.Rendering.RenderGraphModule.Util.RenderGraphUtils+BlitMaterialParameters blitParameters, System.String passName, System.String file, System.Int32 line) (at ./Library/PackageCache/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphUtilsBlit.cs:706)
CustomPixelPerfectPass+PixelPerfectRenderPass.RecordRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ContextContainer frameData) (at Assets/Settings/CustomPixelPerfectPass.cs:72)
UnityEngine.Rendering.Universal.ScriptableRenderer.RecordCustomRenderGraphPassesInEventRange (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.Universal.RenderPassEvent eventStart, UnityEngine.Rendering.Universal.RenderPassEvent eventEnd) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs:1222)
UnityEngine.Rendering.Universal.ScriptableRenderer.RecordCustomRenderGraphPasses (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.Universal.RenderPassEvent startInjectionPoint, UnityEngine.Rendering.Universal.RenderPassEvent endInjectionPoint) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs:1241)
UnityEngine.Rendering.Universal.ScriptableRenderer.RecordCustomRenderGraphPasses (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.Universal.RenderPassEvent injectionPoint) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs:1246)
UnityEngine.Rendering.Universal.UniversalRenderer.OnMainRendering (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs:1350)
UnityEngine.Rendering.Universal.UniversalRenderer.OnRecordRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs:796)
UnityEngine.Rendering.Universal.ScriptableRenderer.RecordRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs:1175)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RecordRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.ScriptableRenderer renderer) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineRenderGraph.cs:10)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RecordAndExecuteRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.ScriptableRenderer renderer, UnityEngine.Rendering.CommandBuffer cmd, UnityEngine.Camera camera, System.String cameraName) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineRenderGraph.cs:24)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RenderSingleCamera (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.UniversalCameraData cameraData) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs:857)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RenderCameraStack (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Camera baseCamera) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs:1082)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.Render (UnityEngine.Rendering.ScriptableRenderContext renderContext, System.Collections.Generic.List`1[T] cameras) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs:469)
UnityEngine.Rendering.RenderPipeline.InternalRender (UnityEngine.Rendering.ScriptableRenderContext context, System.Collections.Generic.List`1[T] cameras) (at <44f3679c53d1477a9c6e72f269e3a3a9>:0)
UnityEngine.Rendering.RenderPipelineManager.DoRenderLoop_Internal (UnityEngine.Rendering.RenderPipelineAsset pipelineAsset, System.IntPtr loopPtr, UnityEngine.Object renderRequest, Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle safety) (at <44f3679c53d1477a9c6e72f269e3a3a9>:0)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
InvalidOperationException: The previously scheduled job ZBinningJob writes to the Unity.Collections.NativeArray`1[System.UInt32] ZBinningJob.bins. You must call JobHandle.Complete() on the job ZBinningJob, before you can write to the Unity.Collections.NativeArray`1[System.UInt32] safely.
Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckWriteAndThrowNoEarlyOut (Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle handle) (at <44f3679c53d1477a9c6e72f269e3a3a9>:0)
Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.GetUnsafePtr[T] (Unity.Collections.NativeArray`1[T] nativeArray) (at <44f3679c53d1477a9c6e72f269e3a3a9>:0)
UnityEngine.Rendering.Universal.Internal.ForwardLights.PreSetup (UnityEngine.Rendering.Universal.UniversalRenderingData renderingData, UnityEngine.Rendering.Universal.UniversalCameraData cameraData, UnityEngine.Rendering.Universal.UniversalLightData lightData) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs:200)
UnityEngine.Rendering.Universal.UniversalRenderer.OnBeforeRendering (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs:871)
UnityEngine.Rendering.Universal.UniversalRenderer.OnRecordRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs:792)
UnityEngine.Rendering.Universal.ScriptableRenderer.RecordRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs:1175)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RecordRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.ScriptableRenderer renderer) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineRenderGraph.cs:10)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RecordAndExecuteRenderGraph (UnityEngine.Rendering.RenderGraphModule.RenderGraph renderGraph, UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.ScriptableRenderer renderer, UnityEngine.Rendering.CommandBuffer cmd, UnityEngine.Camera camera, System.String cameraName) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineRenderGraph.cs:24)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RenderSingleCamera (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.UniversalCameraData cameraData) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs:857)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RenderSingleCameraInternal (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Camera camera, UnityEngine.Rendering.Universal.UniversalAdditionalCameraData& additionalCameraData) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs:690)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RenderSingleCameraInternal (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Camera camera) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs:665)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.Render (UnityEngine.Rendering.ScriptableRenderContext renderContext, System.Collections.Generic.List`1[T] cameras) (at ./Library/PackageCache/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs:482)
UnityEngine.Rendering.RenderPipeline.InternalRender (UnityEngine.Rendering.ScriptableRenderContext context, System.Collections.Generic.List`1[T] cameras) (at <44f3679c53d1477a9c6e72f269e3a3a9>:0)
UnityEngine.Rendering.RenderPipelineManager.DoRenderLoop_Internal (UnityEngine.Rendering.RenderPipelineAsset pipelineAsset, System.IntPtr loopPtr, UnityEngine.Object renderRequest, Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle safety) (at <44f3679c53d1477a9c6e72f269e3a3a9>:0)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
So, my question is, what are you supposed to do with the execute pass function and the PassData so it doesn’t cause any errors?