チリペヂィア

リンクフリー。サンプルコードなどは関連記事内でライセンスについて明示されない限り商用利用なども自由に行って構いませんが、自己責任でお願いします。またこれら日記内容の著作権自体は放棄していません。引用部分については引用元の権利に従ってください。

TextureFormatごとにコンストラクトとGetPixelとSetPixelを総当りしてみた

テストコード

場合によっては普通にキャッチできない例外をはくため、ひたすら「やってみる>例外吐くなら吐かせる」を繰り返します。コンソール荒れますw

[ContextMenu("test")]
private void test()
{
    foreach(TextureFormat format in System.Enum.GetValues(typeof(TextureFormat)))
    {
        Texture2D tex = null;
        try
        {
            Debug.Log("try create:" + format.ToString());
            tex = new Texture2D(1, 1, format, false);
            Debug.Log("try get pixel:" + format.ToString());
            tex.GetPixel(0, 0);
            Debug.Log("try set pixel:" + format.ToString());
            tex.SetPixel(0, 0, new Color());
        }
        finally { if (tex != null) DestroyImmediate(tex); }
    }
}

やってみた結果をまとめますと

TextureFormat test targets.
Alpha8
ARGB4444
RGB24
RGBA32
ARGB32
RGB565
DXT1
DXT5
RGBA4444
PVRTC_RGB2
PVRTC_RGB2
PVRTC_RGBA2
PVRTC_RGBA2
PVRTC_4BPP_RGB
PVRTC_4BPP_RGB
PVRTC_RGBA4
PVRTC_RGBA4
ETC_RGB4
ATC_RGB4
ATC_RGBA8
BGRA32
ATF_RGB_DXT1
ATF_RGBA_JPG
ATF_RGB_JPG

以上の対象にnewとGetPixel()とSetPixel()を繰り返すと、

new Texture2D に失敗するもの

Invalid Flash texture
UnityEngine.Texture2D:.ctor(Int32, Int32, TextureFormat, Boolean)

(コンストラクト例外?何が起こっているのやら本日一番のミステリー)

GetPixel() に失敗するもの
  • PVRTC_RGB2

Unsupported texture format - needs to be ARGB32, RGBA32, BGRA32, RGB24, Alpha8 or DXT
UnityEngine.Texture2D:GetPixel(Int32, Int32)

SetPixel() に失敗するもの
  • ARGB4444

Unsupported texture format - needs to be ARGB32, RGBA32, RGB24 or Alpha8
UnityEngine.Texture2D:SetPixel(Int32, Int32, Color)

ドキュメントにはあまり詳しく書いてませんが、結構いろいろイケますね。ビデオカードとドライバにもよるのかも。

まぁ、でもやっぱりログに表示されている通りROMなら"ARGB32, RGBA32, BGRA32, RGB24, Alpha8 or DXT"、RAMなら" ARGB32, RGBA32, RGB24 or Alpha8"というのが安牌でしょうか。