【Unity】Texture2Dをリサイズする拡張メソッド

Texture2Dをリサイズする方法です。
意外と面倒だったのでメモ。

課題と方針

前提として、Texture2Dは色情報を保ったままリサイズすることが簡単にはできません。
Texture2D.Resize()というメソッドはありますが、これを使うと色情報が未定義状態になって失われてしまいます。

Unity - Scripting API: Texture2D.Resize

そこで今回は次のような手法をとります。

  1. リサイズ後のサイズを持つRenderTextureを取得する
  2. このRenderTextureにリサイズ前のTexture2DをGraphics.Blit()
  3. リサイズ後のサイズを持つTexture2Dを作成する
  4. 3のテクスチャにRenderTextureの情報を書き込む

一度RenderTextureを介しているのがポイントです。

ソースコード

using UnityEngine;

public static class Texture2DExtensions {
    
    private static Texture2D GetResized(this Texture2D texture, int width, int height)
    {
        // リサイズ後のサイズを持つRenderTextureを作成して書き込む
        var rt = RenderTexture.GetTemporary(width, height);
        Graphics.Blit(texture, rt);

        // リサイズ後のサイズを持つTexture2Dを作成してRenderTextureから書き込む
        var preRT = RenderTexture.active;
        RenderTexture.active = rt;
        var ret = new Texture2D(width, height);
        ret.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        ret.Apply();
        RenderTexture.active = preRT;

        RenderTexture.ReleaseTemporary(rt);
        return ret;
    }
}

やっていることは課題と方針に書いた通りです。

RenderTexureのピクセル情報をTexture2Dに格納する方法が特殊ですが、
これは下記の記事で解説しています。

light11.hatenadiary.com

パフォーマンスはよくないだろうなーという感じです。
使うのは主にエディタ拡張だと思うのでそれほど気にして作ってません。

関連

light11.hatenadiary.com

light11.hatenadiary.com