この記事の目的は、3Dデザイナーにゲーム開発で利用されているテクスチャのファイル形式やテクスチャの圧縮形式についてわかりやすく紹介することです。これらの知識を活かすことで、ゲーム用テクスチャの品質、メモリの消費量、シェーダーの計算速度、CPUやGPU間でのデータの発送速度をコントロール出来るようになります。今回、テクニカルのことが苦手な方にも理解を容易にするために、技術的な内容のいくつかを省略します。
この記事がUnityやUnreal Engine、両方のエンジンユーザーに役立つように、実際の例にUnityとUnreal Engineを使用しています。
さあ、始めましょう!
テクスチャリングのパイプライン
テクスチャエディターでのテクスチャ作成の開始からゲームのコンパイルの瞬間まで、ゲーム用のテクスチャ制作のパイプラインは下記のようになります。
各段階に関係するファイルの特徴:
【1】テクスチャエディター用ファイル(SPP、SBSなどのファイル形式)
テクスチャの内容を制作及び編集するファイル形式です。
- ファイルはサイズが非常に大きい
- データは無圧縮
- ゲーム用のファイル形式ではないので、ファイルのサイズは気にしなくても良い
【2】ビットマップファイル(PNG、TGAなどのファイル形式)
テクスチャエディターから書き出して、ゲームエンジンにインポートするファイル形式です。
- ファイルはサイズがまだ大きい
- データは無圧縮
- ゲーム用のファイル形式ではないので、ファイルのサイズは気にしなくても良い
【3】ゲームエンジン用ファイル(META、UASSETなどのファイル形式)
ビットマップファイルをゲームエンジンにインポートするときに自動で制作するファイルです。これらには、ゲームのコンパイル時にゲーム用テクスチャを作成するために必要な設定が保存されています。METAファイルはUnity用のファイル形式で, UASSETはUnreal Engine用のファイル形式です。
- そのファイルの設定の編集によってゲーム用テクスチャの品質、ファイルのサイズ、色空間を変更できる
- ゲーム用のファイル形式ではないので、ファイルのサイズは気にしなくても良い
【4】ゲーム用テクスチャ(DDSなどのファイル形式)
ネイティブにサポートされ、デバイスのGPU及びビデオメモリによって迅速に処理されるテクスチャ形式です。エンジンにインポートされたビットマップテクスチャの内容を使い、META/UASSETの設定通りにゲームのコンパイル時に制作するファイルです。
- ファイルはサイズが小さい
- データはMETA/UASSETの設定通り圧縮された
- ゲーム用のファイル形式なので、ファイルのサイズはゲームのパフォーマンスに影響を与える
ゲーム用テクスチャのサイスの確認方法
テクスチャのファイルのサイズがゲームのコンパイルの後でどうなるか、確認する方法を考えてみましょう。
例として赤レンガのPNGテクスチャをエンジンにインポートしました。テクスチャはファイルのサイズが26.2Mb、解像度が4096px、カラーチャンネルが3つ(RGB)です。
Unity
UnityのProject WindowでインポートされたPNGファイルのアイコンを右クリックして、Properties(Alt+P)を選択すると、テクスチャの設定画面が開きます。
テクスチャの設定画面の下にコンパイルされたテクスチャのプレビュー、解像度、カラーチャンネルの数、圧縮形式、色空間、ファイルのサイズの情報があります。
下記の設定編集によって、コンパイルされたテクスチャのファイルのサイズや品質などを変更することができます。
Max Size | テクスチャのMip 0の解像度です。 |
Compression | プリセットで圧縮形式を選べます。 Defaultのタブでは好きな圧縮形式を直接に選ぶ可能性がありませんが、プラットホームのタブ(PC, IOS, Androidなど)でフォーム用の圧縮形式を直接選べます。 |
Format | Automaticを選ぶと、Compressionのプリセットによって圧縮形式になりますが、ドロップダウンメニューで無圧縮形式を選ぶことが可能です。 |
Alpha Source | こちらでPNGファイルのアルファチャンネルをインポートするかどうか選べます。 |
Generate Mipmaps | こちらでミップマップを生成するかどうか設定出来ます。 |
Unreal Engine
Content Browserでuassetのファイルをダブルクリックすると、テクスチャエディターが開きます。
Detailsのタブの上にコンパイルされたテクスチャの解像度(Max In-Game)、ファイルのサイズ(Resource Size)、アルファチャンネル有無(Has Alpha Channel)、圧縮形式(Format)、ミップマップの数(Number of Mipmaps)を確認できます。
下記の設定の編集によって、コンパイルされたテクスチャのファイルのサイズや品質などを変更することが出来ます。
Maximum Texture Size | テクスチャのMip 0の解像度です。 デフォルト値は「0」となります。それは、コンパイルされたテクスチャの解像度はエンジンにインポートされたPNGファイルと一緒になるという意味です。こちらで好きな解像度を入力すると、コンパイルされたテクスチャの解像度を変更することが出来ます。 |
Compression Settings | 圧縮形式を選ぶことが出来ます。 |
Compress Without Alpha | このチェックボックスにチェックを付けると、PNGファイルのアルファチャンネルはゲーム用のデータにインポートされません。 |
Mipmap Gen Settings | ドロップダウンリストからNoMipmapsを選ぶと、ミップマップを生成されません。 |
ゲーム内のテクスチャ ファイルのサイズに影響を与える要因
- テクスチャの解像度
- テクスチャの圧縮形式
- カラーチャンネルの数(1個,3個,4個)
- ミップマップ有無
テクスチャの解像度、圧縮形式やカラーチャンネルの数はコンパイルされたテクスチャのファイルのサイズにどのくらい影響があるのを考えてみましょう。解像度や圧縮形式によってテクスチャのファイルのサイズはKbでシートに記入されている下記のシートをご覧ください。
シートで紹介された情報によって結論を出しましょう。
・テクスチャ解像度を1段階上げると、メモリ消費量が4倍に増加します。
・アルファ チャネルを使用すると、メモリ消費量が2倍に増加します。
・4Kのテクスチャの利用は大量のメモリが消費されるので、4Kのテクスチャを使う際はご注意ください。
・テクスチャ圧縮アーティファクトを削除する必要がある場合は、無圧縮形式を使用できますが、テクスチャのサイズは小さくしたほうが良いです。(できれば512px以下)
テクスチャの圧縮形式について
テクスチャの圧縮形式の詳細情報:
圧縮形式 | チャンネルの数 | 注意点 |
DXT1|BC1 | 3個 | ・Gチャネルは他のチャネルよりも品質がわずかに高いです。 ・RやBチャネルは品質が一緒です。 ※ それで、一つのDXT1|BC1の圧縮形式のテクスチャに3つのグレースケールのマップをパッキングする際、Gチャンネルには一番重要なマップを入れた方が良いです。一般的にGチャンネルはRoughness/Smoothnessのマップに使われています。(例:ORMのテクスチャ) |
DXT5|BC3 | 4個 | DXT5|BC3はDXT1|BC1+アルファチャンネルとして考えても良いです。 ・アルファチャンネルは品質が最高です。アルファチャンネルの情報の保存に使われているメモリの量は全てのRGBチャンネルに使われているメモリの量とほとんど同じぐらいですから。 ・GチャネルはRやBチャネルよりも品質がわずかに高いです。 ・RやBチャネルは品質が同じです。 ※ それで、一つのDXT5|BC3の圧縮形式のテクスチャに4つのグレースケールのマップをパッキングする際に、アルファチャンネルには一番重要なマップを入れた方が良いです。その次の優先順位として、マップをGチャンネルに入れた方が良いです。 |
BC7 | 3個または4個 | 一般的に、BC7の圧縮形式は上記の圧縮形式より品質が高いです。 ・各チャンネルに使われているメモリの量は同じですので、テクスチャパッキングする際に優先が高いチャンネルがありません。 ・アルファチャネルを追加してもファイルのサイズは増加しません。 ・アルファチャネルを追加すると、他のチャンネルの品質が低下します。 ※ Unity 2023.3のマニュアルによると、OpenGLを使う際に、BC7はMacでサポートされていません。圧縮形式がサポートされていない場合、Unityはデータを無圧縮形式にコンバートしていますので、UnityでBC7を使いたい場合はプログラマーさんに相談してください。 |
ノーマルマップの圧縮形式について
ゲーム用ノーマルマップは画像の形で情報を保存するためにRGチャンネルしか使っていません。
Bチャンネルの情報はRGチャンネルの情報を使ってシェーダーの中で正規化ベクトル用のピタゴラスの定理で計算されています:B=sqrt(1-(R2+G2))
圧縮形式 | チャンネルの数 | 注意点 |
DXTnm (Unity) | 4個 | DXTnm圧縮形式は、Unity用のディフォルトの4つのチャンネルのノーマルマップ形式です。DXTnmはDXT5|BC3のノーマルマップ用のバリエーションとして考えても構いません。 ・DXTnmのAGチャンネルは、ビットマップのノーマルマップのRGチャンネルの情報を保存するために使われています。 ・RBチャンネルは、空っぽでシェーダーには使われていません。 |
BC5 (Unreal Engine、Unity) | 2個 | BC5圧縮形式は、Unreal Engine用のディフォルトの2つのチャンネルのノーマルマップ形式です。 ・BC5のRGチャンネルは、ビットマップのノーマルマップのRGチャンネルの情報を保存するために使われています。 ・BC5はDXTnmより品質が高いです。 BC5圧縮形式は、Unityでプリセットとしてありませんが、プラットホームのタブでDXTnmをBC5でオーバーライドすることができます。 |
ミップマップについて
多くの場合、ミップマップを生成すると、レンダリングが高速化され、モデルがカメラから離れるときに発生するアーティファクトを取り除くのに役立ちます。 しかし、ミップマップを含むテクスチャのファイルのサイズは、ディスク上もメモリ上も33%ほど増加します。
ミップマップの生成が不要な場合もありますが(UIの場合とか、モデルはカメラから常に同じ距離にある場合とか)、その場合はゲームを最適化できる機会となります。
上記で書いてあるのをシェーダーの最適化にどう応用するか、「ゲーム用テクスチャの活用 ~第2部:テクスチャパッキング~」の記事で説明させていただきます。
参考サイト
Block Compression (Direct3D 10)
ID Software – Real-Time Normal Map DXT Compression (PDF)
Nick Mower – Your Guide to Texture Compression in Unreal Engine