強火で進め

このブログではプログラム関連の記事を中心に書いてます。

【Unity】Android の実機でどの様なフォーマットで使われているかを確認する方法

Unity ではテクスチャは様々なフォーマットを選択できますが Androidバイスによってはサポートしていないフォーマットも有ります。その様な場合、 Unity は「非圧縮のRGBA」のフォーマットが使用されます。
今回は Unity 上で様々なフォーマットに設定したテクスチャが Android の実機上ではどの様なフォーマットになっているかを RenderDoc を使って確認する方法を解説します。

事前準備

Render Doc の環境をまだ準備していない場合にはこちらの記事を参考に環境を作成しておいて下さい。

実機上では「非圧縮のRGBA」に変更されている事を確認

ここでは現状のほとんどの Androidバイスでは対応していない(※)「RGB Compressed DXT1」というフォーマットを使って確認します。 Graphic API は Open GL ES 3 を使用して検証する事にします。
NVIDIATegra GPU などが対応しています。

Unity のプロジェクトに card_frame というテクスチャを追加し、フォーマットを「RGB Compressed DXT1」にします。
f:id:nakamura001:20211007192157p:plain

これを「Development Build」を有効にして「Build And Run」を実行します。
f:id:nakamura001:20211007192004p:plain

こちらの記事を参考に Android アプリと RenderDoc を接続します。

「Texture View」タブに切り替えて「card_frame」のテクスチャを確認すると「RGB Compressed DXT1」を指定したにも関わらず、「非圧縮のRGBA(R8G8B8A8_UNORM)」になっている事が確認できます。
f:id:nakamura001:20211007191327p:plain

「ETC」だが NPOT の場合

次に「RGB Crunched ETC」でテストしてみます。 ETC フォーマットの場合には POT (2の乗数のサイズ) のテクスチャでないと駄目ですが card_frame の画像は 480x640 と NPOT (2の乗数では無いサイズ)な為に実際には「非圧縮のRGBA」が使われます。
f:id:nakamura001:20211007193221p:plain

RenderDoc で確認すると R8G8B8A8_UNORM になっています。
f:id:nakamura001:20211007193417p:plain

「ETC」で POT の場合

次に card_frame の画像を 256x256 と POT なサイズに変更して確認してみます。
f:id:nakamura001:20211007193729p:plain

確認すると「ETC」では無く、「ETC2(ETC2_RGB8_UNORM)」が使われてます。
f:id:nakamura001:20211007204720j:plain

「鎖」のアイコンをクリックして OpenGL ES のコマンドではどうなっているか確認します。
f:id:nakamura001:20211007210144p:plain

「GL_COMPRESSED_RGB8_ETC2」という事が確認できました。 ETC2 は ETC の上位互換が有り「GL_COMPRESSED_RGB8_ETC2」は「GL_OES_compressed_ETC1_RGB8_texture」と後方互換性が有ります。 という事でAndroid の実機上でもちゃんと「ETC」として扱われている事が確認できました。
f:id:nakamura001:20211007210111p:plain

ちなみに Graphic API を Vulkan に変更した場合の結果はこちら。
f:id:nakamura001:20211007215744p:plain
f:id:nakamura001:20211007215706p:plain

参考情報

Unityでビルド後の転送処理の時に以下のエラーが出る場合には RenderDoc を終了させて下さい。

Unable to start ADB server. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details.

Unity で設定可能なテクスチャフォーマット。
Recommended, default, and supported texture compression formats, by platform - Unity マニュアル

ETC2 のフォーマットが ETC(ETC1) の上位互換で有るとの記述部分。
docs.imgtec.comKhronos Data Format Specification v1.1 rev 9

RGB ETC2 is a format for compressing RGB data. It is a superset of the older ETC1 format. This means that an older ETC1 texture can be decoded using an ETC2-compliant decoder. The main difference is that the newer version contains three new modes; the ‘T-mode’ and the ‘H-mode’ which are good for sharp chrominance blocks and the ‘Planar’ mode which is good for smooth blocks.