Unreal Engine のテクスチャ形式のサポートと設定

サポートされるテクスチャ形式、ファイル タイプとそれらのコンフィギュレーションに関するリファレンス。

デジタル プロジェクトのメモリ使用量を増やす最大の原因のひとつは使用するテクスチャとサイズです。幸い、Unreal Engine には、全てのプロジェクトのテクスチャ全体のテクスチャ サイズを非破壊的に削減する非常に堅牢なシステムがあります。 以下のページでは、こうしたシステムを紹介し、システムを使用してプロジェクトのテクスチャ メモリの必要量を減らす方法について説明します。

テクスチャ解像度

Unreal Engine では、.INI ファイルに若干の修正を加えて、1 x 1 から 8192 x 8192 までのテクスチャ解像度をサポートします。現在の DirectX ビデオ アダプタとゲーム コンソールは、1 x 1 から 2048 x 2048、最高 8192 x 8192 まで様々なテクスチャ解像度をサポートしています。特定のハードウェア デバイスがサポートするテクスチャの最高解像度はメーカーやモデル、利用可能なテクスチャ メモリによって変わります。Unreal Engine 4 には、ワールド ジオメトリやユーザーインターフェース (UI) などの様々な領域でレンダリングされたテクスチャ解像度を管理するための機能や設定が数多くあります。

エンジンのテクスチャ解像度の制限

Unreal Engine 4 では、テクスチャ ミップの最大数をデフォルトで 14 に制限しており、これはレンダリング テクスチャ最大数を実質的に 4096 (1 x 1 から 8192x8192 は 14 ミップ) に制限します。ただし、インポートされた 8192 のテクスチャは、最高 4096 の mip1 しかレンダリングされないという不都合な部分もあります。定数 MAX_TEXTURE_MIP_COUNT は、エンジン ソースファイルでデフォルトで 13 になっているので、8192 テクスチャ レンダリングをサポートするように、この値を 14 に変更することもできます。この定数は次のソース ファイル (2009年 QA3 月時点。他の QA バージョンに対しては確認すること) で定義されています。

Src\D3D10Drv\Src\D3D10Device.cpp   
Src\Engine\Inc\RHI.h   
Src\Engine\Inc\UnTex.h   
Src\Engine\Src\RHI.cpp   
Src\Engine\Src\TextureCube.cpp

UE 4.8 のリリースによって、プロジェクトを修正して、最高サイズ 8192 までのテクスチャを使用するように変更できます。これを行うには、以下のテキストをプロジェクトの BaseDeviceProfiles.ini ファイルに追加し、 MaxLODsize8192 に設定します。C++ コードを修正する必要はありません。

[/Script/Engine.TextureLODSettings]
TextureLODGroup_World=(MinLODSize=1,MaxLODSize=8192,LODBias=0,MinMagFilter=aniso,MipFilter=point)

サイズを増やしたいセクションを追加したら、ファイルを保存し、エディタを再起動します。エディタが 8192 のサイズでインポートされたテクスチャで再起動すると、最大 4096 にクランプされるのではなく、8192 は LOD 1 のサイズとして表示されます。以下のサンプル画像では、最高 8192 サイズのテクスチャを使用できるように UE 4.8 プロジェクトの DefaultEngine.ini ファイルを修正しました。テクスチャ、T_8K_Test が UE4 で読み込まれると、インポートされたテクスチャと表示されたテクスチャのサイズが両方とも 8192 になることがわかります。

Click image for full size.

圧縮テクスチャ メモリ要件

DXT は、パレットカラーおよび補間カラーを持つ 4x4 ブロックにピクセルをパッキングすることに基づいた不可逆圧縮を使用します。これは、8:1 DXT1 および 4:1 DXT5 を一定の圧縮ファイル サイズにします。ビデオ メモリおよびテクスチャプール リソースは特定のプラットフォームやハードウェア用に固定されるため、テクスチャ解像度とリソース使用の間の均衡をとらなければなりません。次の表は、フルのミップ (1x1 最高フルのネイティブ mip0 ) の様々な一般的解像度での DXT1 および DXT5 のテクスチャのメモリ要件です。メモリ要件はテクスチャ解像度率のほぼ定数倍で、DXT5 テクスチャは DXT1 の 2 倍近くのメモリを必要とするため注意してください。

解像度と圧縮の比率が一定であるため、ここにリストされていないテクスチャ解像度のメモリ要件を算出するには、解像度率を倍数計算するだけです。 例えば、1024 x 512 テクスチャは 1024 x 1024 の 2 分の 1 のメモリ要件になります。

この表データは、ボックス フィルタ ミップ生成および DirectX Texture Compression を使用した ATI の Compressonator で作成されたテクスチャからコンパイルされました。

解像度

1x1 からの総ミップ数

DXT1

DXT5

16x16

5 mips

312 bytes

496 bytes

32x32

6 mips

824 bytes

1.48kb (1,520 bytes)

64x64

7 mips

2.80kb (2,872 bytes)

5.48kb (5,616 bytes)

128x128

8 mips

10.8kb (11,064 bytes)

21.4kb (22,000 bytes)

256x256

9 mips

42.8kb (43,832 bytes)

85.4kb (87,536 bytes)

512x512

10 mips

170kb (174,904 bytes)

341kb (349,680 bytes)

1024x1024

11 mips

682kb (699,192 bytes)

1.33MB (1,398,256 bytes)

2048x2048

12 mips

2.66MB (2,796,344 bytes)

5.33MB (5,592,560 bytes)

4096x4096

13 mips

10.6MB (11,184,952 bytes)

21.3MB (22,369,776 bytes)

8192x8192

14 mips

42.6MB (44,739,384 bytes)

85.3MB (89,478,640 bytes)

Engine Config TextureGroup プロパティ

特定のゲーム TextureGroups に対してサポートされている最小および最大の LOD (ミップ)は、いくつかのエンジン コンフィギュレーション ファイルで定義されます。 コンフィギュレーション設定ファイルの一連のソースは、[Unreal Engine 4 Install Location]\Engine\Config\BaseDeviceProfiles.ini ファイルの [/Scripts/Engine.TextureLODSettings] セクションにあります。

ゲーム開発にあたり、[your_game]\Config\DefaultDeviceProfiles.ini ファイルは、Engine\Config\ フォルダにある基本プロパティのミラーセットを含み、ゲームの特定の設定を変更したコピーとなっています。

Unreal Editor およびゲーム内用に TextureGroup エントリの独立したセットがあることに注意してください。こうした 2 つのセットはそれぞれ、config ファイルの [SystemSettingsEditor] と [SystemSettings] セクションにあります。

DefaultDeviceProfiles.ini ファイルにある TextureLODGroup 設定エントリはこれに似ています。古い QA バージョンは、各設定用に MinMagFilter および MipFilter のプロパティを含んでいないことがありますのでご注意ください。

[/Script/Engine.TextureLODSettings]
; NOTE THAT ANY ITEMS IN THIS SECTION WILL AFFECT ALL PLATFORMS!!!
@TextureLODGroups=Group
TextureLODGroups=(Group=TEXTUREGROUP_World,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_WorldNormalMap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_WorldSpecular,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Character,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_CharacterNormalMap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_CharacterSpecular,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Weapon,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_WeaponNormalMap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_WeaponSpecular,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Vehicle,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_VehicleNormalMap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_VehicleSpecular,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Cinematic,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Effects,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_EffectsNotFiltered,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Skybox,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_UI,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Lightmap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Shadowmap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,NumStreamedMips=3,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_RenderTarget,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_MobileFlattened,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Terrain_Heightmap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Terrain_Weightmap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Bokeh,MinLODSize=1,MaxLODSize=256,LODBias=0,MinMagFilter=linear,MipFilter=linear,MipGenSettings=TMGS_SimpleAverage)
+TextureLODGroups=(Group=TEXTUREGROUP_Pixels2D,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=point,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)

PC AppCompat バケット

AppCompat は、目的および起動時に収集される実証的証拠を基に、様々なSystemSettings をオーバーライドするために使用されます。app compatibility を有効 (PC のみ) にすると、システムはマシンの能力を計測し、5 つのバケットの一つからプリセット値で Engine.ini 値を上書きします。この使用例については Engine\Config\ フォルダ BaseCompat.ini をご覧ください。

AppCompat はゲーム (エディタではなく) が初めて実行された時に、「一回だけ」チェックされることになっています。[game]Engine.ini の [AppCompat] セクションの存在をチェックすることでこれを検出します。これは、マシン用に事前演算されたスコアを含んでいます。AppCompat が既に一度適用されている場合は、毎回上書きすることなくユーザーがカスタム変更できるように AppCompat が再度変更されることはありません。

AppCompat は特にエディタに対して無効になっているため、開発中に様々なマシンでアセットがどのように表示されるかについて、マシン スペックが影響を与えることはありません。これは、SystemSettings およびSystemSettingsEditor が分かれている理由です。

ゲームに空の DefaultCompat.ini を与えることで、AppCompat を無効にできますが、これは Engine.ini の [SystemSettings] からすべてのバケットを初期化させます。この場合、システムは AppCompat が導入される前の動作とまったく同じように動作します。

TEXTUREGROUP プロパティ

各 TextureGroup エントリは、ゲームのレンダリングで使用されるように、特定のテクスチャ セットのテクスチャ プロパティを定義します。共通セットにテクスチャをグループ化すると、様々なゲーム テクスチャ リソースで使用されるテクスチャのメモリ プールに対する制御を向上させます。

プロパティ

説明

MinLODSize

レンダリングされる最小ミップ サイズでピクセル単位で指定し、1 から 8192 の範囲で 2 の累乗で示します。MaxLODSize よりも少なくなければなりません。

MaxLODSize

レンダリングされる最大ミップ サイズでピクセル単位で指定し、1 から 8192 の範囲で 2 の累乗で示します。MinLODSize より大きくなければなりません。

LODBias

レンダリング用のアップロードに先立ちオフセットするミップ レベル数を決定する正または負の値で、MinLODSize および MaxLODSizeの範囲内に数値をクランプします。

MinMagFilter

テクスチャが GPU によって縮小または拡大される場合のテクスチャ フィルターのタイプを指定します。下記のチャートを参照。

MipFilter

テクスチャを離れた場所またはグレージング角から見る場合に GPU が 2 つのミップをブレンドすべきかを指定します。下記のチャートを参照。

NumStreamedMips

ストリーム インまたはストリーム アウトさせることが可能なミップ数。テクスチャが 10 段階のミップを持ち、NumStreamedMips が 2 の場合、最上位から 2 つのミップのみがストリーム インまたはストリーム アウトされます。従って、8 - 10 段階のミップは任意の時間、メモリに存在します。NumStreamedMips を 0 に設定すると、ミップはストリーミングされず、この LOD を使用するテクスチャは常に全て読み込まれます。NumStreamedMips を -1 に設定すると、全てのミップがストリーム インまたはストリーム アウトされるようにします (ただし、その他の制限はなおも適用されます)。NumStreamedMips はオプション設定であり、デフォルト値は -1 となります。

フィルタリング

MinMagFilter

MipFilter

フィルタタイプ

point

Point

linear

point

Bilinear

linear

Trilinear

aniso

point

Anisotropic Point

aniso

Anisotropic Linear

TextureGroup, LODGroup および LODBias

config ini ファイルで指定された TextureGroup および LODBias 、Texture プロパティで指定された LODGroup および LODBias の設定によって、各テクスチャで使用されるテクスチャ ミップの最終セットが決まります。

[your_game]Engine.ini にあるTextureGroup エントリの例は以下のようなものになります。

Group=TEXTUREGROUP_World,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage

TEXTUREGROUP_World LODGroup に割り当てられたテクスチャは、レンダリングに使用するミップ範囲を決めるためにこうした設定を使用します。
Texture プロパティの追加の LODBias 設定は、config ini ファイルの TextureGroupで指定された LODBias に追加されます。

LODBias は、 レンダリング用にどのミップが選択されるかを バイアス またはオフセットします。LODBias は、LODGroup が最小/最大範囲の前に演算されます。Texture プロパティにある LODBias は、使用する最終 LODBias 値を決定するため、TextureGroup でLODBias に追加されます。
値 0 のLODBias はメイン (ネイティブ) のテクスチャ解像度です。値 1 の LODBias はテクスチャの第 1 の解像度を低下させたミップで、LODBias 2 は、第 2 の解像度を低下させたミップです。例えば、1 の LODBias を持つ 1024 x 1024 テクスチャでは、512 x 512 のミップがレンダリング用に選択されます。

各テクスチャ用に Texture プロパティで指定されたLODBias は、正にも負にもなるため、TextureGroup のデフォルト LODBias をより高い、またはより低いミップ値にオフセットしてしまうことがあります。
例えば、

  • 値 0 の TextureGroup LODBias および値 0 の Texture Properties LODBias では、最終の LODBias 値は 0 になります。

  • 値 0 の TextureGroup LODBias および値 1 の Texture Properties LODBiasでは、最終の LODBias 値は 1 になります。

  • 値 1 の TextureGroup LODBias および値 1 の Texture Properties LODBiasでは、最終の LODBias 値は 2 になります。

  • 値 1 のTextureGroup LODBias および値 -1 の Texture Properties LODBias は、最終の LODBias 値は 0 になります。

最終の LODBias が計算されると、TextureGroup の最小/最大 LODSize 範囲内になるかどうか、テクスチャ ミップをチェックします。必要があれば調整します。これは、最小 / 最大の LOD 範囲内に特定の TextureGroup をクランプする、簡単な config ini ファイル変更を可能にします。

例えば、上記のTEXTUREGROUP_World LODGroup にある場合、値 1 の LODBias の 1024 x 1024 テキスチャは 512 x 512 ミップを使い、次に TextureGroup の最小および最大の LODSize 範囲内に入っているかをチェックします。この場合だと、最小値が 256 で最大値が 1024 です。各ゲームタイトルが独自の TextureGroup 設定を持つため、アーティストおよびレベル デザイナーの方は各グループの MinLODSize および MaxLODSize に気をつけてください。MaxLODSize が 1024 の TextureGroup に 2048 のテクスチャを割り当ててゲームを出荷した場合、レンダリング品質上、何もメリットがなく、配布可能なパッケージのサイズを増やします。

テクスチャのプロパティ

様々なテクスチャ プロパティの意味の説明は、 「テクスチャ プロパティ」ページを参照してください。

このページは Unreal Engine の前のバージョン用です。現在リリースされている Unreal Engine 5.3 に対して更新は行われていません。
Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル