URPでRenderPassを追加してBlitを使ったらエラーが出る場合

今回紹介するの方法は回避方法と思われます。
根本解決かは分からないです。

エラーは、CameraType.Previewの時に発生します。
そこで単純な回避方法として、RenderPass内でCameraType.Previewの時だけ描画をスキップします。

環境

次の環境でRenderPassを追加してSwapBuffersを使ったBlitでエラーが発生しました。

  • Unity2022.3.13f1
  • URP 14.0.9

該当コード

Executeの中身は以下の通り。

public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
    if (material == null)
    {
        return;
    }
    var cmd = CommandBufferPool.Get(RenderPassName);
    Blit(cmd, ref renderingData, material);
    context.ExecuteCommandBuffer(cmd);
    CommandBufferPool.Release(cmd);
}

エラー内容

表示されたエラーは以下の通り。
CameraType.Previewの時にBlitの内でAssertionで止まっています。

Assertion failed
UnityEngine.Rendering.Universal.ScriptableRenderPass:Blit (UnityEngine.Rendering.CommandBuffer,UnityEngine.Rendering.Universal.RenderingData&,UnityEngine.Material,int)
...

さらに、次のエラーも表示される。 Blitter.BlitTexture内のテクスチャ周りに問題がありそうなエラー。

ArgumentNullException: Value cannot be null.
Parameter name: value
UnityEngine.MaterialPropertyBlock.SetTexture (System.Int32 nameID, UnityEngine.Texture value) (at /Users/bokken/build/output/unity/unity/Runtime/Export/Shaders/MaterialPropertyBlock.cs:113)
UnityEngine.Rendering.Blitter.BlitTexture (UnityEngine.Rendering.CommandBuffer cmd, UnityEngine.Rendering.RTHandle source, UnityEngine.Vector4 scaleBias, UnityEngine.Material material, System.Int32 pass) (at ./Library/PackageCache/com.unity.render-pipelines.core@14.0.9/Runtime/Utilities/Blitter.cs:261)
UnityEngine.Rendering.Blitter.BlitCameraTexture (UnityEngine.Rendering.CommandBuffer cmd, UnityEngine.Rendering.RTHandle source, UnityEngine.Rendering.RTHandle destination, UnityEngine.Material material, System.Int32 pass) (at ./Library/PackageCache/com.unity.render-pipelines.core@14.0.9/Runtime/Utilities/Blitter.cs:377)
UnityEngine.Rendering.Universal.ScriptableRenderPass.Blit (UnityEngine.Rendering.CommandBuffer cmd, UnityEngine.Rendering.RTHandle source, UnityEngine.Rendering.RTHandle destination, UnityEngine.Material material, System.Int32 passIndex) (at ./Library/PackageCache/com.unity.render-pipelines.universal@14.0.9/Runtime/Passes/ScriptableRenderPass.cs:718)
UnityEngine.Rendering.Universal.ScriptableRenderPass.Blit (UnityEngine.Rendering.CommandBuffer cmd, UnityEngine.Rendering.Universal.RenderingData& data, UnityEngine.Material material, System.Int32 passIndex) (at ./Library/PackageCache/com.unity.render-pipelines.universal@14.0.9/Runtime/Passes/ScriptableRenderPass.cs:732)
...

対処

CameraTypeがGameとSceneViewの時だけ処理するように変更を入れるとエラーが出なくなりました。

public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
    if (renderingData.cameraData.camera.cameraType == CameraType.Preview)
    {
        return;
    }
	//以下は同じ
}

CameraTypeのPreviewだけで発生するのでこのような回避方法にしました。