このページでは、Unity の スクリプタブルレンダーパイプライン (SRP) で、コマンドバッファを使用して、または直接の API 呼び出しによってレンダリングコマンドのスケジューリングと実行を行う方法を説明します。このページの情報は、ユニバーサルレンダーパイプライン (URP)、HD レンダーパイプライン (HDRP)、SRP をベースにしたカスタムレンダーパイプラインに当てはまります。
SRP では、C# スクリプトを使用してレンダリングコマンドの設定とスケジューリングを行います。次に、Unity の低レベルグラフィックス アーキテクチャに実行を指示し、グラフィックス API に命令を送信します。
API 呼び出しによってこれを行う主な方法は、ScriptableRenderContext を使用することですが、コマンドバッファをすぐに実行することもできます。
SRP では、ScriptableRenderContext クラスが、C# のレンダーパイプラインコードと Unity の低レベルグラフィックスコードの間のインターフェースとして機能します。SRP のレンダリングは遅延実行を使用して機能します。ScriptableRenderContext を使用してレンダリングコマンドのリストを構築し、Unity にそれらを実行するよう指示します。次に、Unity の低レベルグラフィックスアーキテクチャは、グラフィックス API に命令を送信します。
レンダリングコマンドのスケジューリングを行うには、以下の方法があります。
スケジュールしたコマンドを実行するよう Unity に指示するために、ScriptableRenderContext.Submit を呼び出します。コマンドのスケジューリングにコマンドバッファを使用したかどうか、または API の呼び出しによってコマンドをスケジューリングしたかどうかは関係ありません。Unity は、すべてのレンダリングコマンドを同じ方法で ScriptableRenderContext にスケジューリングし、Submit()
を呼び出すまではどれも実行しません。
このサンプルコードは、コマンドバッファを使用して、現在のレンダーターゲットをクリアするコマンドをスケジューリングして実行する方法を示しています。
using UnityEngine;
using UnityEngine.Rendering;
public class ExampleRenderPipelineInstance : RenderPipeline
{
public ExampleRenderPipelineInstance() {
}
protected void Render(ScriptableRenderContext context, Camera[] cameras) {
// 現在のレンダーターゲットを消去するためのコマンドを作成しスケジューリングします
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, true, Color.black);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
// グラフィックス API がスケジュールされたコマンドを実行するようにスクリプタブルレンダーコンテキストに指示させます
context.Submit();
}
}
Graphics.ExecuteCommandBuffer() を呼び出すことによって、スクリプタブルレンダーコンテキストを使わずに即座にコマンドバッファを実行できます。この API への呼び出しは、レンダーパイプラインの外部で行われます。
コマンドバッファを使用してスケジューリングできるコマンドの詳細については、コマンドバッファに関するスクリプトリファレンス を参照してください。