Version: 2020.1
言語: 日本語
スクリプタブルレンダーパイプラインの概要
スクリプタブルレンダーパイプラインバッチャー

スクリプタブルレンダーパイプラインにおけるレンダリングコマンドのスケジューリングと実行

このページでは、Unity の スクリプタブルレンダーパイプライン (SRP) で、コマンドバッファを使用して、または直接の API 呼び出しによってレンダリングコマンドのスケジューリングと実行を行う方法を説明します。このページの情報は、ユニバーサルレンダーパイプライン (URP)、HD レンダーパイプライン (HDRP)、SRP をベースにしたカスタムレンダーパイプラインに当てはまります。

SRP では、C# スクリプトを使用してレンダリングコマンドの設定とスケジューリングを行います。次に、Unity の低レベルグラフィックス アーキテクチャに実行を指示し、グラフィックス API に命令を送信します。

API 呼び出しによってこれを行う主な方法は、ScriptableRenderContext を使用することですが、コマンドバッファをすぐに実行することもできます。

ScriptableRenderContext API の使用

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 への呼び出しは、レンダーパイプラインの外部で行われます。

その他の情報

コマンドバッファを使用してスケジューリングできるコマンドの詳細については、コマンドバッファに関するスクリプトリファレンス を参照してください。

スクリプタブルレンダーパイプラインの概要
スクリプタブルレンダーパイプラインバッチャー