【Unity】CommandBuffer入門

CommandBufferのことはじめです。

CommandBufferとは

CommandBufferとは、レンダリングパイプラインのいくつかのタイミングにいろんな処理を挟み込める機能です。
例えば下の例のように、不透明描画の後にメッシュの描画を挟み込む、などといったことができます。

パイプライン自体を細かくカスタムできるわけではないのでその点は注意。

最小コードで検証してみる

CommandBufferの挙動を確認するために最小コードを書いてみます。

using UnityEngine;
using UnityEngine.Rendering;

[RequireComponent(typeof(Camera))]
public class CommandBufferDrawMesh : MonoBehaviour {

    [SerializeField]
    private Mesh _mesh;

    void Awake () {

        // コマンドバッファを作成
        var commandBuffer = new CommandBuffer();
        commandBuffer.name = "Test Command Buffer";

        // レンダリングパイプラインに挟み込みたい処理を記述
        // ここではメッシュを描画している
        var material = new Material(Shader.Find("Standard"));
        commandBuffer.DrawMesh(_mesh, Matrix4x4.identity, material, 0, 0);

        // コマンドバッファをカメラに追加
        // 第一引数でパイプラインのどこに挟み込むかを指定
        GetComponent<Camera>().AddCommandBuffer(CameraEvent.AfterForwardOpaque, commandBuffer);
    }
}

この通り、使い方はかなりシンプルです。
説明はコメントの通りになりますが、まずCommandBufferのインスタンスを作成し、次に処理を登録し、最後にカメラにAddする、という流れになります。

今回は不透明描画の後にメッシュの描画を挟み込んでいるので、これをカメラにアタッチして再生するとメッシュが描画されます。

f:id:halya_11:20180404191450p:plain

また、CommandBufferで登録した処理はFrame Debuggerで確認できます。便利!

f:id:halya_11:20180404192102p:plain

処理を挟めるタイミング

処理を挟めるタイミングはCameraEventのenumで定義されています。

docs.unity3d.com

Camera.AddCommandBuffer()の第一引数にいずれかを渡すことでタイミングを指定します。

参考サイト

docs.unity3d.com

https://forum.unity.com/threads/commandbuffer-drawmesh-is-black.474458/

関連

light11.hatenadiary.com