[Unity] RenderTextureからピクセル色を取得する

RenderTextureのピクセルの色をスクリプトから参照する方法の紹介です。
今回紹介する方法はPro版限定となります。

RenderTextureから何らかのプロパティやメソッドを用いてピクセル色を取得できないかと思いましたが、一筋縄にはいかないようです。
バッファとなるテクスチャを作成し、そこにRenderTextureの画像データを転送し、その結果を適用することで初めて色が取得できるようになります。

実際のスクリプトは以下のようになります。

using UnityEngine;
using System.Collections;

public class GetPixelTest : MonoBehaviour {
    public Camera dispCamera;
    private Texture2D targetTexture;

    // Use this for initialization
    void Start() {
        var tex = dispCamera.targetTexture;
        targetTexture = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false);
    }

    // Update is called once per frame
    void Update() {
        // 指定されたカメラのRenderTexture取得
        var tex = dispCamera.targetTexture;

        // 画像データ読み込み
        RenderTexture.active = dispCamera.targetTexture;
        targetTexture.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
        targetTexture.Apply();

        // 画素値を取得する
        var color = targetTexture.GetPixel(0, 0);
        Debug.Log(color.ToString());
    }
}

まず、ピクセル色を取得したいRenderTextureの転送先のバッファとなるテクスチャを最初に作成します。

    var tex = dispCamera.targetTexture;
    targetTexture = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false);

ピクセル色を取得するときは、RenderTexture.active(staticメンバ)に取得元のRenderTextureを指定します。
そして、targetTexture.ReadPixels()でピクセルデータを転送します。
このままでは色をスクリプトから参照できないので、targetTexture.Apply()で転送処理を適用します。

    // 指定されたカメラのRenderTexture取得
    var tex = dispCamera.targetTexture;

    // 画像データ読み込み
    RenderTexture.active = dispCamera.targetTexture;
    targetTexture.ReadPixels (new Rect (0, 0, tex.width, tex.height), 0, 0);
    targetTexture.Apply ();

これで、targetTexture.GetPixel()により色を取得できるようになります。引数にはピクセル座標を指定します。

    // 画素値を取得する
    var color = targetTexture.GetPixel(0, 0);
    Debug.Log (color.ToString ());

以上のような流れになります。
ピクセル色を取得するまでに時間がかかるため、あまり頻繁に利用しないほうがよいでしょう。