関連ブログ
- [UE5] 元の位置に戻るカメラの実装 2024.12.18UE
- [UE5]難易度変更に対応したシューティングゲームを作ってみよう 2024.12.11UE
- [UE5] インタラクト可能なモノの量産に役立つBPを作ってみよう 2024.12.04UE
CATEGORY
2022.06.08UE5
執筆バージョン: Unreal Engine 5.0 |
こんにちはこんにちは。アートディレクターの黒澤です。今回はUnreal Engine 5(以下、UE5)の画像の圧縮フォーマットについて解説します。
Unreal Engineに画像をインポートすると、独自の.uassetという形式に変換されます。
PSDでもTGAでもPNGでもjpegでも、すべて.uassetに変換されているため、元のデータフォーマットの違いはほとんどなくなっていますが、以下のフォーマットはいくつかの問題があるため、おすすめしません。
さらにUnreal Engineの画像データは、ビューポート上やパッケージしたときに設定したフォーマットに変換されます。
これをまとめると図のような関係になります。
ゲームで使われる画像フォーマットには様々な種類がありますが、Texture EditorのCompresssion Settingsで選択するだけでほぼすべての設定が可能です。ただしCompresssion Settingsでは実際にはそのフォーマットを適用できないにもかかわらず選択できてしまうので、適切なフォーマットになったかどうかは、Formatに表示される文字を確認する必要があります。
では、それぞれのCompresssion Settingsで選べるフォーマットについてみてみましょう。
最も基本的なテクスチャ用の画像フォーマットです。Default (DXT1/5 , BC1/3 on DX11)の括弧の中の意味は、DirectX11以上の場合はBC1もしくはBC3が使われ、それ以外の場合はDXT1もしくはDXT5というフォーマットが使われるという意味です。UE5の動作条件はDirectX12なので、PC用にパッケージする場合はBC1もしくはBC3が使用されます。
BC1/3には以下のような特性があります。
※ BC1/3を使用するには4の倍数が最低条件になりますが、多くの3Dモデル用のテクスチャはMipMapを持つことでメモリの効率が良くなり、遠景のジャギーを防げるので2のべき乗でデータを持つことが一般的です。
Masks( no sRGB )を選択すると、ほぼDefaultと同じなのですが、sRGBのチェックが外れます。そのため例えばラフネスのようなデータにはこちらを使用すると良いでしょう。
余談ですがFormatにはDXT1と表記されますが、これはDirectXのバージョンを反映していない旧来のままの表記です。表記はDXT1でもRenderDocで確認したところ実際に使われているのはBC1でした。
ノーマルマップなどに使われる画像フォーマットです。DirectX11以上の場合はBC5ですが、それ以下の場合はDXT5が選ばれます。ユニークな特徴としてはRとGの2つのチャンネルしか持ちません。Normalmapは正規化されたベクトルなので、R(Tangent)とG(Binormal)があればB(Normal)は計算で求めることができます。そのため画像データではRGの2つのチャンネルだけを持ち、データサイズに対して圧縮精度を上げています。
BC5には以下のような特性があります。
主にUIで使用する画像フォーマットです。UIは細かな文字情報を扱い、視認性も必要なためB8G8R8A8が使用されます。このフォーマットは非圧縮のデータであり、非常にデータサイズが大きいのが特徴です。
圧縮設定の名前こそUserInterface2Dですが、UIで使用するテクスチャだからといって無条件でこの設定を使うべきではありません。UIのアニメーションに使うノイズなどは、3Dのフォーマットに習ってBC1を使用しても劣化は目立ちにくく、グレースケールの画像であればG8やBC4にすることでデータサイズを大きく削減できます。
ゲームでの使用例は少ないですが、Vector Displacement MapやVATに使用するテクスチャも圧縮によるアーティファクトが目立つので、非圧縮が使われます。
B8G8R8A8には以下のような特性があります。
BC1などの圧縮フォーマットは、イラストなどの色の差が激しいものに弱いです。
BC1では色の差が大きな場所は圧縮ノイズが発生します。
※ 色がわかりやすいようにNearest補完で表示しています
B8G8R8A8ではブロック圧縮を行わないため、圧縮ノイズが全くかかりません。
この画像フォーマットも非圧縮ですが、B8G8R8A8が4チャンネル持つことに対して、こちらは1チャンネルしか持たないのでデータサイズは約1/4になります。
使い所はUIのグレースケールのデータやDisspalcementmapのような圧縮によるアーティファクトが問題になりやすいデータです。
G8には以下のような特性があります。
G8と同じくグレースケールのデータですが、このデータはブロック圧縮が入ります。データサイズはBC1と同じになり、同じグレースケールの画像であればBC1を使用した場合よりも、ブロックノイズが目立ちません。
BC4には以下のような特性があります。
非圧縮のハイダイナミックレンジの画像です。非常にデータサイズが大きく、ゲームで使用する場合はかなり解像度を絞る必要があります。
余談ですが、Unreal Engineは32bitの画像フォーマットで.hdrと.exrの二種類をサポートしますが、.hdrの場合は自動的にCubemapに変換され、内部的には6枚の画像の組み合わせになります。Cubemapの場合はマテリアルエディタでのUVの扱いも大きく変わります。
.exrをインポートした場合
.hdrをインポートした場合
BC4には以下のような特性があります。
圧縮されたハイダイナミックレンジの画像です。ゲームで使用する場合は、通常はこちらを使用することをおすすめします。
BC6Hには以下のような特性があります。
圧縮はされますがブロックノイズが目立ちにくく非常に綺麗です。
データサイズはBC1の二倍になります。3D用のテクスチャでブロックノイズが目立つときに使用すると良いでしょう。
BC7には以下のような特性があります。
高輝度なデータ(32bit)の半分の16bitを持ち、1チャンネルだけ(Rだけ)の非圧縮なデータです。使い所はHeightが多いのではないかとおもいます。
R16Fには以下のような特性があります。
最後にこれらの画像フォーマットの特徴を表にしてみました。データサイズなどは一般的なもので、解像度が高いデータはその分大きくなります。
フォーマット(DXT1やBC1など)によって扱える情報量やデータサイズ、圧縮による画像の荒れかたが異なり、データサイズが異なると、メモリの使用量や読み込み時間にも影響します。
適切なフォーマットを選択して、データ効率のいいファイルを作るように心がけましょう。
データサイズ | ビット数 | チャンネル数 | 圧縮による劣化 | |
DXT1 / BC1 | 小さい | 8 bit | 3 ( カラー ) | 荒い |
DXT5 / BC3 | やや小さい | 8 bit | 4 ( カラー+アルファ ) | 荒い |
BC5 | やや小さい | 8 bit | 2 ( RG ) | 普通 |
B8G8R8A8 | 非常に大きい | 8 bit | 4 ( カラー+アルファ ) | – |
G8 | 大きい | 8 bit | 1 ( グレースケール ) | – |
BC4 | 小さい | 8 bit | 1 ( グレースケール ) | 綺麗 |
FloatRGBA | 非常に大きい | 32 bit | 4 ( カラー+アルファ ) | – |
BC6H | やや小さい | 32 bit | 3 ( カラー ) | 荒い |
BC7 | やや小さい | 8 bit | 3 ( カラー ) 4 ( カラー+アルファ ) |
綺麗 |
R16F | 非常に大きい | 16 bit | 1 ( R ) | – |