デジタル プロジェクトのメモリ使用量を増やす最大の原因のひとつは使用するテクスチャとサイズです。幸い、Unreal Engine には、全てのプロジェクトのテクスチャ全体のテクスチャ サイズを非破壊的に削減する非常に堅牢なシステムがあります。 以下のページでは、こうしたシステムを紹介し、システムを使用してプロジェクトのテクスチャ メモリの必要量を減らす方法について説明します。
テクスチャ解像度
Unreal Engine 4 では、.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 ファイルに追加し、 MaxLODsize を 8192 に設定します。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 のテクスチャを割り当ててゲームを出荷した場合、レンダリング品質上、何もメリットがなく、配布可能なパッケージのサイズを増やします。
テクスチャのプロパティ
様々なテクスチャ プロパティの意味の説明は、 「テクスチャ プロパティ」ページを参照してください。