【Unity】レンダーテクスチャのピクセル情報を取得する

RenderTextureからピクセル情報を取得する方法です。

考え方

前提として、RenderTextureから直接ピクセル情報を取得することはできません。
これに対しTexture2DにはGetPixels()が定義されているのでピクセル情報を取得できます。

docs.unity3d.com

よって、まずRenderTextureのピクセル情報をTexture2Dに格納したあとに、
Texture2Dからピクセル情報を取得するというアプローチをとります。

ソースコード

using UnityEngine;

public class GetRenderTexturePixels : MonoBehaviour {
    
    [SerializeField]
    private RenderTexture _target;

    private Color[] GetPixels()
    {
        // アクティブなレンダーテクスチャをキャッシュしておく
        var currentRT = RenderTexture.active;

        // アクティブなレンダーテクスチャを一時的にTargetに変更する
        RenderTexture.active = _target;

        // Texture2D.ReadPixels()によりアクティブなレンダーテクスチャのピクセル情報をテクスチャに格納する
        var texture = new Texture2D(_target.width, _target.height);
        texture.ReadPixels(new Rect(0, 0, _target.width, _target.height), 0, 0);
        texture.Apply();

        // ピクセル情報を取得する
        var colors = texture.GetPixels();
            
        // アクティブなレンダーテクスチャを元に戻す
        RenderTexture.active = currentRT;

        return colors;
    }
}

説明はコメントに書いていますが、RenderTexureのピクセル情報をTexture2Dに格納する方法が特殊なので補足しておきます。

まずTexture2DにはReadPixels()という、スクリーンの色情報をこのテクスチャに格納するメソッドがあります。
名前わかりづらい。

Unity - Scripting API: Texture2D.ReadPixels

ここでいうスクリーンとはすなわちレンダーターゲットのことです。
レンダーターゲットをRenderTextureにするには、はRenderTexture.activeを使います。

Unity - Scripting API: RenderTexture.active

すなわち、下記のようにすればTexture2Dにピクセル情報を格納できるということになります。

  1. ピクセル情報を得たいレンダーテクスチャをレンダーターゲットにしておく
  2. ReadPixels()によりレンダーターゲットのピクセル情報をTexture2Dに格納する

そのほかはコメント通りです。

関連

light11.hatenadiary.com

参考

docs.unity3d.com

Unity - Scripting API: Texture2D.ReadPixels

Unity - Scripting API: RenderTexture.active