読者です 読者をやめる 読者になる 読者になる

【Unity】RenderTexture

はじめに

こんにちは、Unityエンジニアの清水です。
この記事はカヤックUnityアドベントカレンダー2016の11日目の記事になります。

今日はRenderTextureについてお送りします。

RenderTextureとは

RenderTextureはカメラで撮影した内容をTextureとして使える機能です。
公式ドキュメント

RenderTextureを使うことで、鏡や動画を表示するモニターなどのオブジェクトを表現することができます。
Camera.targetTextureにRenderTextureを設定すると、そのカメラの撮影結果はスクリーンには描画されず、RenderTextureに描画されることになります。

var renderTexture = new RenderTexture(256, 256, 24);
var camera = GetComponent<Camera>()
camera.targetTexture = rt;

RenderTexture.formatでカラー形式を指定することができますが、PVRTCなどの圧縮系は使えないためメモリへの負荷は高いです。 そのため、サイズや枚数を使いすぎないように注意しましょう。
動かしている端末で指定したカラー形式をサポートしているかどうかはSystemInfo.SupportsRenderTextureFormatでチェックできます。

パフォーマンスチューニングでの使用

RenderTextureは描画表現のためだけでなく、パフォーマンスチューニングに使える場合もあります。
RenderTextureへ描画した後、Camera.targetTextureにnullを設定しても描画内容は失われません。
そのため、静的で描画負荷が高いような画面を1度だけRenderTextureに描画し、それ以降はそのRenderTextureを使うことで、重い描画処理を毎フレーム実行する必要が無くなります。
RenderTexture分のメモリ負荷が増えるので、描画後は元のリソースをアンロードしておくと良いでしょう。
構成要素が多く、オーバードローが大量に発生しているような背景などで有効です。
ただし、大きな面積のRenderTextureを使うことになるので、メモリ使用量は増える可能性があります。
対象の画面で何がパフォーマンス上のネックになっているのかをきちんと把握した上で使いましょう。

Texture2Dへの変換

RenderTextureはシーン遷移などで内容が失われるため、1度描画したRenderTextureを長い期間保持したいならTexture2Dに変換します。
ただしTexture2Dへの変換は重い処理なのでタイミングに注意しましょう。

RenderTexture original = RenderTexture.active;
RenderTexture.active = renderTexture;
Texture2D newTexture = new Texture2D(renderTexture.width, renderTexture.height);
newTexture.ReadPixels(new Rect(0, 0, newTexture.width, newTexture.height), 0, 0);
RenderTexture.active = original;

Texture2Dに変換しない場合、RenderTexture.IsCreated()がfalseになったタイミングで再描画するという方法もあります。

おわりに

今日はRenderTextureについて紹介させて頂きました。

明日はによるuGUIの話になります。