I am trying to write the depth texture in a custom render pass in URP (Render Graph API). In the old built-in RP I had no problems achieving this, but I cannot get it to work in URP.
I assume it’s a configuration issue with the pipeline or the pass, because I reduced the problem to rendering a single cube with the default URP Lit shader, which does not show up in the _CameraDepthTexture.
This is the render pass:
public class TestRenderPass : ScriptableRenderPass
{
Material _material;
int _layerMask;
public TestRenderPass(Material material, int layerMask)
{
_material = material;
_layerMask = layerMask;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
{
using (var builder = renderGraph.AddRasterRenderPass<PassData>("Test Render Pass", out var passData))
{
var renderingData = frameContext.Get<UniversalRenderingData>();
var cameraData = frameContext.Get<UniversalCameraData>();
var lightData = frameContext.Get<UniversalLightData>();
var sortFlags = cameraData.defaultOpaqueSortFlags;
var renderQueueRange = RenderQueueRange.opaque;
var filterSettings = new FilteringSettings(renderQueueRange, _layerMask);
var drawSettings = RenderingUtils.CreateDrawingSettings(new ShaderTagId("UniversalForward"), renderingData, cameraData, lightData, sortFlags);
if (_material != null)
{
drawSettings.overrideMaterial = _material;
}
var rendererListParameters = new RendererListParams(renderingData.cullResults, drawSettings, filterSettings);
passData.RendererListHandle = renderGraph.CreateRendererList(rendererListParameters);
var resourceData = frameContext.Get<UniversalResourceData>();
builder.UseRendererList(passData.RendererListHandle);
builder.SetRenderAttachment(resourceData.activeColorTexture, 0);
builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.Write);
builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context));
}
}
static void ExecutePass(PassData data, RasterGraphContext context)
{
context.cmd.DrawRendererList(data.RendererListHandle);
}
class PassData
{
public RendererListHandle RendererListHandle;
}
}
And the renderer feature:
public class TestRenderFeature : ScriptableRendererFeature
{
[SerializeField] Material material;
[SerializeField] LayerMask layerMask;
TestRenderPass _renderPass;
public override void Create()
{
if (material == null)
{
Debug.LogError(nameof(TestRenderFeature) + ": " + nameof(material) + " is not set.");
return;
}
_renderPass = new TestRenderPass(material, layerMask)
{
renderPassEvent = RenderPassEvent.AfterRenderingOpaques
};
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (_renderPass != null)
{
if (renderingData.cameraData.cameraType is CameraType.Game or CameraType.SceneView)
{
renderer.EnqueuePass(_renderPass);
}
}
}
}
I added a cube and set it to a separate layer that is culled by the renderer.

I then added the renderer feature and set it to render meshes on that layer with a default Lit material.

If I toggle the renderer feature, the cube disappears and reappears as expected.
However, it never shows up in the _CameraDepthTexture. Only the sphere next to it, rendered normally, is visible in the depth texture:
What am I missing?





