はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】3分で分かるRenderTextureを使ってRawImageにカメラの映像を写す手順

はじめに

今回はRenderTextureを使ってカメラに映る映像をテクスチャに反映させてみたいと思います。

f:id:hanaaaaaachiru:20201201171010g:plain
RenderTextureを使った例

1. RenderTextureアセットを作成

まずはProjectビューにてCreate -> RenderTextureを選択し,RenderTextureアセットを作成します。

f:id:hanaaaaaachiru:20201201165231p:plain
アセット生成

2. テクスチャにレンダリングするカメラを用意

HierachyビューにてCameraゲームオブジェクトを生成し,CameraコンポーネントTargetTextureに先ほど生成したRenderTextureアセットを設定します。

f:id:hanaaaaaachiru:20201201165708p:plain
Cameraゲームオブジェクト生成
f:id:hanaaaaaachiru:20201201173036p:plain
TargetTextureの設定


こうすることでTargetTextureを設定したCameraコンポーネントは画面(Gameビュー)に直接レンダリングされるのではなく、Textureにレンダリングされるようになります。

3. RenderTexureを描画するUIを作成

RenderTextureを描画するRawImageを作成します。UI -> RawImageを選択。

f:id:hanaaaaaachiru:20201201170208p:plain
RawImage生成

あとはRawImageコンポーネントTextureに最初に作成したRenderTextureアセットを設定すればOKです。

f:id:hanaaaaaachiru:20201201173054p:plain
RawImageの設定

4. 使い終わったとき

これを知らない方がめちゃくちゃ多いですが、使い終わったあとにRenderTexture.Releaseを呼んでください。

これは公式ドキュメントにも書いてあることですが、明示的に開放をしないと正しくガベージコレクションが働かないらしいです。
UnityEngine.RenderTexture - Unity スクリプトリファレンス

using UnityEngine;

public class RenderTextureTest : MonoBehaviour
{
    [SerializeField] private RenderTexture _tex;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.R))
        {
            Debug.Log("Release");
            _tex.Release();
        }
    }
}


RenderTexture自体はピクセルに描画を始めたときにメモリが確保され,RenderTexture.Release()が呼ばれたときに開放されるようです。(一応Destory(object obj)でもいけるみたい)
RenderTextureのメモリを解放するのはReleaseが良いの?Destroyが良いの? - 渋谷ほととぎす通信

また開放したといってもテクスチャ自体は破壊されず、使用時に自動的に再作成されます。

結構忘れがちですのでご注意ください。