ストリーミング バーチャル テクスチャリング (SVT) は、プロジェクトにあるテクスチャをディスクからストリーミングするための代替手段です。SVT には、Unreal Engine の既存のミップベースの テクスチャ ストリーミング と比べて、いくつかの利点があり、いくつかの欠点もあります。
従来のミップ ベースのテクスチャ ストリーミングでは、マテリアルの UV 使用量の分析をオフラインで行ってから、オブジェクトの可視性とカメラからの距離に基づいて、テクスチャのどのミップ レベルをロードするかをランタイム時に決定します。このプロセスでは、対象とするストリーミング データは全テクスチャのミップ レベルであるため、制限される場合があります。
高解像度のテクスチャを使用している場合にテクスチャの高いミップ レベルをロードすると、パフォーマンスが大幅に低下し、メモリのオーバーヘッドが大幅に高くなる可能性があります。また、ミップベースのテクスチャ ストリーミングは、CPU ベースのオブジェクトの可視性とカリングを使用して CPU によって決定されます。
オブジェクトが表示されないようにするために可視性はより保守的になり、システムが何かをロードする可能性が高くなります。そのため、オブジェクトの一部だけが見えている場合でも、そのオブジェクト全体が見えていると見なされます。オブジェクトは、ストリーミングに必要になる可能性がある関連するすべてのテクスチャも含めてロードされます。
対照的に、バーチャル テクスチャリング システムでは、UE が表示を求めるテクスチャの部分のみがストリーミングされます。バーチャル テクスチャリングでは、まず、すべてのミップ レベルが小さな固定サイズのタイルに分割されます。目に見えるタイルのうち、画面上のすべての目に見えるピクセルによってアクセスされるタイルを GPU が特定します。つまり、UE がオブジェクトを可視性があると見なすと、そのオブジェクトが CPU に伝えられ、GPU によって必要なタイルが GPU のメモリ キャッシュにロードされます。テクスチャのサイズにかかわらず、可視であると見なされるのは、SVT の固定タイル サイズ分のみです。標準の深度バッファを使用して可視性が GPU で計算され、ピクセルに影響する可視部分に対してのみ SVT のリクエストが出されます。
バーチャル テクスチャリングを有効にする
[Project Settings (プロジェクト設定)] で、[Engine (エンジン)] > [Rendering (レンダリング)] > [Virtual Textures (バーチャル テクスチャ)] を参照し、[Enable virtual texture support (バーチャル テクスチャのサポートを有効化)] の横のチェックボックスをオンにします。
画像をクリックすると、拡大表示されます。
[Project Settings (プロジェクト設定)] の [Editor (エディタ)] > [Texture Import (テクスチャのインポート)] > [Virtual Textures] カテゴリで、SVT に新しくインポートするテクスチャの検証に使用する最小テクスチャ サイズを指定できます。テクスチャがこの最小サイズ要件を満たしている場合は、自動的にそのテクスチャ アセットに対して バーチャル テクスチャ ストリーミング が有効になります。
これらの設定項目については、「バーチャル テクスチャリングの参照情報」ページを参照してください。
テクスチャとマテリアルを変換する
プロジェクトでバーチャル テクスチャリングを有効にする場合は、テクスチャとマテリアルが適切に機能するように設定する必要があります。テクスチャでは Virtual Texture Streaming (バーチャル テクスチャ ストリーミング のサポートを有効にします。また、マテリアルの Texture Samples (テクスチャ サンプル) で、非バーチャル サンプラ タイプではなく バーチャル サンプラ タイプが使用されるように変更します。
下記のオプションから選択して、SVT で使用できるようにテクスチャとマテリアルを適切にセットアップします。
変換メニュー オプション
-
コンテンツ ブラウザで、SVT で使用できるように変換するテクスチャ アセットを選択します。
-
右クリックしてコンテキスト メニューを開き、[Convert to Virtual Texture (バーチャルテクスチャに変換)] を選択します。
このメニュー オプションを使用して、バーチャル テクスチャから通常のテクスチャに変換することもできます。
-
[Convert To (変換先)] ウィンドウに、選択したテクスチャ (複数可) および、それらを参照しているマテリアルがリストされます。
-
[OK] をクリックすると、変換プロセスが開始されます。
変換プロセス中に、各テクスチャ アセットのテクスチャ エディタの設定にある Virtual Texture Streaming が有効になります。選択されたテクスチャ (複数可) を参照しているマテリアルでは、Texture Sample ノードが、非バーチャル サンプラ タイプではなく バーチャル サンプラ タイプを使用するように変換されます。
手動での変換
- 変換するテクスチャ アセットをコンテンツ ブラウザ内でダブルクリックすると、テクスチャ エディタ が開きます。
-
[Details (詳細)] パネルの [Texture (テクスチャ)] にある Virtual Texture Streaming を有効にします。
前述の 変換メニュー オプション を使用せずにこれを有効にすると、変換されたテクスチャを参照する既存のすべてのマテリアルが直ちに無効化されます。変換されたテクスチャを参照するマテリアルを開いて、正しい バーチャル サンプラ タイプを使用するように Texture Sample ノードを設定します。たとえば、バーチャル テクスチャでは、Sampler Type に [Color (カラー)] ではなく [Virtual Color (バーチャルカラー)] を指定します。
正しいサンプラ タイプを使用していない Texture Sample ノードがあると、[Stats (統計)] パネルおよびそのノードの下部に、次のようなエラー メッセージが表示されます。
- このエラー メッセージでは、割り当てられた VT Texture Sample 式で間違っている Sampler Type が特定されています。
- テクスチャ サンプルの Sampler Type を Virtual タイプのいずれかに変更します。
- VT Texture Sample 式が正しくレンダリングされ、その式の右下に「VT」と表示されます。
バーチャル テクスチャをマテリアル グラフに追加すると、UE は自動的にバーチャル サンプラ タイプを割り当てます。ただし、その式を、マテリアル インスタンスで使用できる Texture Sample Parameter にする場合は、基本マテリアルではバーチャル サンプラ タイプがすべての子インスタンスに適用されることに注意してください。基本マテリアルでバーチャル タイプになっていないテクスチャ パラメータ スロットにはバーチャル テクスチャを割り当てることができないことを覚えておいてください。
UDIM のサポート
U-Dimension (「UDIM」) は、複数のテクスチャ画像をスタティックメッシュまたはスケルタルメッシュ モデルの個別の UV 領域にマッピングできるようにするテクスチャ命名規則です。UDIM 命名規則を使用すると、UE が画像ファイルのグループを 1 つのバーチャル テクスチャ アセットとしてインポートすることができます。
UDIM でのバーチャル テクスチャリングのサポートは、次のような理由で役に立ちます。
- 非常に大きいテクスチャではなく、個別の小さい多数のテクスチャで使用できます。
- 各 UDIM 画像では異なる解像度を使用できるため、ピクセル密度が均一ではないバーチャル テクスチャを使用できます。
たとえば、4 つの画像ファイル (2048x2048 のテクスチャが 2 つ、128x128 のテクスチャが 2 つ) が 2x2 のパターンで配置されている UDIM バーチャル テクスチャをインポートすると、バーチャル テクスチャではこれらの画像が 1 つの 4098x4098 テクスチャとして論理的にサンプリングされます。UE では、ディスクやランタイム メモリの使用量に影響を与えることなく、小さい 128x128 の画像を引き伸ばして、大きい 2048x2048 の画像と同じ領域を埋めます。小さい 128x128 のテクスチャで 2048x2048 のテクスチャの解像度を埋めると、この場合はメモリを消費しません。
UDIM のワークフローの詳細については、「The Foundry's UDIM Workflow」チュートリアルを参照してください。
次の命名規則を使用することで、自分のプロジェクトでバーチャル テクスチャリングによる UDIM テクスチャを使用できます。
BaseName.####.[サポートされている画像形式]
次に例を示します。
MyTexture.1001.png
UE は、この命名規則に合致している画像をインポートすると、同じ BaseName の後に別の座標番号が付いている名前の他の画像がないか、ソース フォルダ内をスキャンします。見つかった各画像は、4 桁の番号によって、マッピング先の場所が定義されます。ただし、0 ~ 1 の範囲のメッシュ UV への従来のテクスチャ マップをインポートすると、UDIM 画像は、その定義済み UV 座標に基づいて UV の 0 ~ 1 の空間にマッピングされます。
インポート時に、UDIM テクスチャは垂直方向に反転されます。これは、Unreal Engine での UV のサンプリング時の左上の座標が (0,0) であるためです。UDIM テクスチャを使用しているメッシュの UV も、インポートした UDIM テクスチャの向きで正常に動作するように、インポート時に調整されます。そのため、エンジンにインポートされると、マテリアル内の前述のテクスチャのような UV をサンプリングするための UV は次のようになります。
パフォーマンスとコスト
プロジェクトでのバーチャル テクスチャリングのパフォーマンスとコストを測定するには、以下のセクションに従います。
バーチャル テクスチャリングの統計をとる
バッククォート (`) キーを押してコンソールを開き、次のコマンドを入力して統計情報を有効にします。
stat virtualtexturing を使用すると、バーチャル テクスチャリング シーンのコスト (ミリ秒単位) およびページ テーブルのカウンタに関する詳細を確認できます。
stat virtualtexturememory を使用すると、現在のシーンでのバーチャル テクスチャリングの使用に関連するメモリ カウンタが表示されます。
ストリーミング バーチャル テクスチャリングのビジュアライゼーション
コンソール コマンド r.VT.Borders 1 を使用すると、ストリーミング バーチャル テクスチャを使用しているマテリアル上にミップ ビジュアライゼーション グリッドが描画されます。
必要なくなったら、r.VT.Borders 0 を使用してグリッドを非表示にします。
マテリアルのルックアップとスタック
マテリアルのバーチャル テクスチャからのサンプリングは、従来のテクスチャからのサンプリングよりも負荷が高くなります。バーチャル テクスチャリングのコストは次の 2 カテゴリに分かれています。
- ルックアップ は、マテリアル グラフ内で、プロジェクトでサンプリングされるバーチャル テクスチャごとに行われます。
- スタック は、プロジェクトで同じ UV とサンプラ ソースが使用される場合にバーチャル テクスチャを結合します。
バーチャル テクスチャは、従来のテクスチャ サンプルよりも常にコストが大きくなります。常に 2 つ以上のテクスチャがフェッチされ、いくつかの数学命令が実行されます。ただし、同じ UV とサンプラ ソースを使用する VT テクスチャ サンプルの複数のスタック (最大で 8 つ) を結合することによって、そのコストの一部が償却されます。
次のシンプルなマテリアルの例では、UE はデフォルトの UV を使用して 2 つの VT Texture Sample 式をサンプリングしています。そのテクスチャ サンプルの各ルックアップに対して Virtual Texture Lookup が加算され、どちらも 1 つの UV を使用しているため、それらは 1 つの Virtual Texture Stack に結合されています。
ただし、プロジェクトで異なる UV が使用されている場合は、Virtual Texture Stack のフェッチが 2 回になってコストが増えます。
1 つ目の例では、2 回のルックアップと 1 回のスタックで、合計 3 回のテクスチャ フェッチが行われています。どちらの VT サンプルでも同じ UV が使用されているため、UE はスタックを結合してテクスチャ フェッチ回数を節約します。2 つ目の例では、2 回のルックアップと 2 回のスタックで、合計 4 回のテクスチャ フェッチが行われています。VT Texture Sample では Base Color と Normal のテクスチャ サンプルに異なる UV が使用されているため、それらを 1 つのスタックに結合することはできません。
マテリアルに関する追記
- UE は、ストリーミング バーチャル テクスチャを、そのサイズに関係なく、テクスチャごとに固定サイズのタイルに分割します。また、最低解像度のミップをタイル サイズで制限します。これは多くの場合は問題になりませんが、多数のノイズがあるテクスチャや高い詳細度のテクスチャでは、低解像度のミップがないために、エイリアシングやモアレ効果が現れることがあります。また、これによって GPU パフォーマンス負荷が高くなる可能性があることに注意してください。ただし、それを実際に測定するのは難しい場合があります。
制限事項
基本的には、バーチャル テクスチャは通常のテクスチャと交換可能ですが、次のような制限事項があり、コストが高くなります。
- テクスチャの寸法は 2 の累乗である必要がありますが、UE ではもともと正方形である必要はありません。ただし、現在の実装では、正方形である方が、メモリがより効率的に使用されます。
- ミップ間のトリリニア フィルタリングのサポートは、推計学的に処理されます。テンポラル アンチエイリアシング (TAA) を使用している場合は、通常のトリリニア フィルタリングとほとんど見分けがつきませんが、場合によっては目に見えるノイズが生じることがあります。
- UE では、異方性フィルタリングのサポートを [Tile Border (タイル境界)] 設定のサイズで制限しています。デフォルト値の 4 では、異方性フィルタリングでのメモリ使用量はテクスチャに対する典型的なフィルタリングよりも少なくなりますが、この値を大きくするとメモリ使用量が増えます。
- VT ストリーミングは本来リアクティブであるため、レンダリングされたフレームで必要になった後まで、CPU では VT タイルをロードする必要があることがわかりません。したがって、特に解像度の高い VT タイルがロードされる場合、カメラがシーンを移動するときに、目に見えるポップインが発生する可能性があります。