ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】テクスチャの設定について

今回はテクスチャの設定における注意点などをまとめてみました。ゲーム内リソースでテクスチャが占める割合は多く、開発初期にテクスチャの仕様を決めておかないと後半でメモリ不足に苦しむこともありえます。というかあります。

適切なサイズにする

例えば画面がHD(1280 x 720)なのにフルHD(1920 x 1080)を基準にテクスチャサイズを決めるのは余計にメモリを消費するだけです。最終的に出力される画面に合わせてサイズを決めましょう。

また、サイズは2のべき乗(128x128, 256x256, 128 x 256)になるようにしましょう。この辺について説明をすると長くなるのでハードウェア都合による仕様と思っていただけるとです ^_^;

ただし、Atlasの対象となるテクスチャは別に問題ないです。最終的にAtlasになったテクスチャのサイズが2のべき乗になれば良いです。

Atlasについてはこちらのサイトが作り方を含めて分かりやすく説明してくれてます。
kan-kikuchi.hatenablog.com

圧縮フォーマットを設定する

圧縮フォーマットを設定する事で更にメモリ消費を抑える事もできます。ただし、こちらは見た目が汚くなったり、端末やOSによってサポートされる圧縮フォーマットが異なるので注意が必要です。

以下、Unityでテクスチャの圧縮フォーマットを設定する方法です。

  • Projectビューから対象テクスチャを選択
  • Inspectorビュー から各OSのアイコンをクリック
  • Override for iOS/Android にチェックを入れる
  • Format のプルダウンから圧縮フォーマットを選択
  • Apply」ボタンをクリック

f:id:aki517:20191116104103g:plain

iOS

iPhone6以降(CPUがA8以降)かで以下のように分かれます。

iPhone6以降 iPhone6以前
・RGB(A) Compressed ASTC ・RGB Compressed PVRTC 4bits
・RGBA Compressed PVRTC 4bits
テクスチャサイズを正方形にする必要あり
Android

Android端末がOpenGLES3.0以降をサポートかで以下のように分かれます。

OpenGLES3.0以降 それ以外
・RGBA Compressed ETC2 8bits
・RGB Compressed ETC2 4bits
・RGB Compressed ETC 4bit
・RGBA 16bit

Override ETC2 fallback
こちらは 対象のAndroid端末が上記のETC2圧縮が未サポートの場合、どのフォーマットを指定するかというものになります。

タイプ 説明
Use build settings BuildSettingsの設定を参照します。
f:id:aki517:20191129082653p:plain
32bit 32bitカラーです。フルカラーなので品質は良くなりますがメモリを多く消費します。
16bit 16bitカラーです。32bitよりメモリ消費を抑えれますが色数が減るので下図のグラデーション破綻が起こりやすいです。
f:id:aki517:20191130100631p:plain
32bit half resolustion 32bitカラーで解像度が半分になります。メモリ消費を抑えれますが解像度が落ちているのでボヤけた見た目になります。
MipMap

段階的に小さくしたテクスチャを複数保持し、カメラからの距離に応じて使用するテクスチャを切り替える事によって描画のパフォーマンスを最適化します。(ちなみに正確にはカメラからの距離でテクスチャを切り替えているのではなく、描画するポリゴンが画面に対して占める面積で判定してます。)

f:id:aki517:20191127042416p:plain

Unityによる設定は対象テクスチャを選択し Inspectorビュー > Advance > Generate Mipmap にチェックを入れます。
f:id:aki517:20191126091907g:plain

デメリットとしては段階ごとの複数テクスチャを持つため、データサイズが 1.34倍になります。また、画像がボヤけた状態になりやすいです。これは距離に対して最適な段階のテクスチャが参照されていないために発生する問題です。 f:id:aki517:20191126091259p:plain

また、UI用のテクスチャはこの設定を無効にした方が良いです。UIは距離によってサイズが変化することがほぼ無いので、MipMapを有効にしても高速化が見込めず、メモリをただ消費するだけです。

その他

その他でUnityのテクスチャ設定で重要なものを幾つか以下にまとめました。

sRGB

Project Settings > Other Settings > Color Space が Gamma の場合はチェックを入れる必要があります。

ちなみに sRGB とはカラースペースを定義する国際規格です。 Windowsの基準になっている色空間(Color Space)でデジタルカメラ、プリンタ、PCモニター等での標準色として使われています。

omoide-photo.jp

Read/Write Enable

基本はチェックを外します。スクリプト内でデータを書き換える場合は有効にする必要がありますがメモリ消費が2倍になるのと、対象テクスチャが非圧縮テクスチャとDXTテクスチャに対してだけ有効なためほぼ使いどころは無いです。
f:id:aki517:20191129234230p:plain

Wrap Mode

タイリング時にテクスチャをどう処理するか設定します。

モード 表示 説明
Repeat f:id:aki517:20191130105901p:plain:w200 テクスチャを繰り返し表示します。
Clamp f:id:aki517:20191130105911p:plain:w200 テクスチャ端のピクセルを引き伸ばします。
Mirror f:id:aki517:20191130105946p:plain:w200 Repeatと同じで繰り返しですが鏡のように反転させて表示します。
Mirror Once f:id:aki517:20191130105953p:plain:w200 UV座標の0,0を中心にMirrorを一度だけ行い、移行はClampと同じ引き伸ばし処理をします。

ちなみに Mirror Once は利用できない端末があるので、 SystemInfo.supportsTextureWrapMirrorOnce を使って端末がサポートしているか確認する必要があります。

Filter Mode

3Dモデルのスケールなどでテクスチャを引き伸ばした際の処理(フィルタリング)を設定します。 Trilinear > Biliner > Point の順に高品質かつ処理が重くなります。

モード 説明
Point(no filter) フィルタなしです。ブロック状のジャギジャギした見た目になります。
Bilinear 隣接ピクセル間の平均を取ってぼかした見た目になります。
Trilinear Bilinear処理 + Mipmap間でのぼかしも入ります。

f:id:aki517:20191130093537p:plain

Aniso Level

急角度でテクスチャを見た際の品質を設定します。地面や壁などが該当します。 ちなみに下図のように0(OFF)と1では見た目に分かりやすい差が出ていますが、それより大きい値を設定してもそんなに見た目は変化しないので基本は 0(OFF) か 1(ON) で良いです。
f:id:aki517:20191130095406p:plain
f:id:aki517:20191130095403p:plain

まとめ

色々と書きましたが、最終的には用途やゲーム仕様に応じて設定するのが良いです。例えば、エフェクトなど一瞬で消える演出に使われるテクスチャはサイズを小さくして圧縮をかけて品質を落とす等です。

あとは規模にもよりますが、ここでまとめた設定を AssetPostProcessor を使いインポート時に自動設定できるとかすると良いですね。どんどん自動化して空いた時間をゲームの品質向上に割り当てれるようにするのはとても大事です。

参考

テクスチャ - Unity マニュアル
Unity - Manual: Using sampler states