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だけで発生するのでこのような回避方法にしました。