Version: 2019.4
言語: 日本語
アクティブなレンダーパイプラインアセットの設定
スクリプタブルレンダーパイプラインバッチャー

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

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

これを行う主な方法は、スクリプタブルレンダーコンテキストを使用することですが、コマンドバッファをすぐに実行することもできます。

スクリプタブルレンダーコンテキストの使用

スクリプタブルレンダーコンテキスト (Scriptable Render Context) は、C# コードと Unity の低レベルグラフィックスコード間のインターフェースとして機能します。スクリプタブルレンダーパイプライン (SRP)では、レンダリングは遅延実行を使用して機能します。 スクリプタブルレンダーコンテキストを使用してレンダリングコマンドのリストをビルドし、Unity にそれらを実行するよう指示します。次に、Unity の低レベルグラフィックスアーキテクチャは、グラフィックス API に命令を送信します。

レンダリングコマンドのスケジューリングを行うには、以下の方法があります。 * CommandBuffersScriptableRenderContext.ExecuteCommandBuffer() を使って、スクリプタブルレンダーコンテキストに渡します。 * スクリプタブルレンダーコンテキストで、ScriptableRenderContext.Cull()ScriptableRenderContext.DrawRenderers() などの API コールを直接呼び出します。

スケジュールしたコマンドを実行するよう Unity に指示するために、ScriptableRenderContext.Submit() を呼び出します。コマンドのスケジューリングにコマンドバッファを使用するかどうか、または API の呼び出しによってコマンドをスケジューリングしたかどうかは関係ありません。Unity は、すべてのレンダリングコマンドをスクリプタブルレンダーコンテキストで同じ方法でスケジューリングし、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 への呼び出しは、レンダーパイプラインの外部で行われます。

その他の情報

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

アクティブなレンダーパイプラインアセットの設定
スクリプタブルレンダーパイプラインバッチャー