概要
URP12からURP14へ移行時に詰まったポイントをメモ程度にまとめています、前提として下記の記事を巡回済みの方が対象です。
・https://zenn.dev/sakutaro/articles/convert_blitter
解決策
上記の記事に下コードという表記があるが
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
if (renderingData.cameraData.isSceneViewCamera)
{
return;
}
var cmd = CommandBufferPool.Get(ProfilerTag);
Blitter.BlitCameraTexture(cmd, cameraColorTarget, cameraColorTarget, material, 0);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
このコードではうまく動いているように見えるが、
同じバッファに同一シェーダで読み書きしてはいけないと言うUnityのルールに反しているため、
同一のバッファに書き込めているように見えて内部では別の状態として保存されている。
なので複数のRendererFeatureを使用すると、
イメージ的にはSource側のcameraColorTargetには前回の処理後の状態が入るはずだが、
実際にはScriptableRenderFeatureが始まったときのバッファの状態が入ってくる。
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
if (renderingData.cameraData.isSceneViewCamera)
{
return;
}
var cmd = CommandBufferPool.Get(ProfilerTag);
Blitter.BlitCameraTexture(cmd, cameraColorTarget, bufferTarget, material, 0);
Blitter.BlitCameraTexture(cmd, bufferTarget, cameraColorTarget);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
なので上記のように一旦別のバッファに描画し、それをメインバッファにコピーするとうまく複数の描画が行なえます。