ストリーミング バーチャル テクスチャリング

ストリーミング バーチャル テクスチャの概要です。

Windows
MacOS
Linux

ストリーミング バーチャル テクスチャリング (SVT) は、ディスクからテクスチャをストリーミングする手法の 1 つです。Unreal Engine 4 (UE4) の既存のミップベースの テクスチャ ストリーミング と比べて、いくつかのメリット (デメリット) があります。

従来のミップベースのテクスチャ ストリーミングは、マテリアルの UV 使用量のオフライン分析を実行してから、実行時にオブジェクトの可視性と距離に基づいてロードするテクスチャのミップ レベルを決定します。このプロセスでは、すべてのテクスチャ ミップ レベルについてストリーミング データが分析されるため、パフォーマンスを制限する可能性があります。

高解像度のテクスチャを使用する場合、ミップ レベルの高いテクスチャをロードすると、パフォーマンスとメモリのオーバーヘッドが非常に大きくなる可能性があります。また、ミップベースのテクスチャ ストリーミングは、CPU ベースのオブジェクトの可視性とカリングを使用して CPU によって決定されます。

オブジェクトが表示されなように、可視性はより保守的になります。つまり、システムは何かをロードしない可能性が高くなります。したがって、オブジェクトのわずかな部分でも表示される場合は、オブジェクト全体が表示されるものと見なされます。オブジェクトは、ストリーミングが必要な可能性がある、関連付けられているテクスチャも含めてロードされます。

対照的に、バーチャル テクスチャリング システムでは、UE が表示を求めるテクスチャの部分のみがストリーミングされます。バーチャル テクスチャリングでは、まず、すべてのミップ レベルが小さな固定サイズのタイルに分割されます。目に見えるタイルのうち、画面上のすべての目に見えるピクセルによってアクセスされるタイルを GPU が特定します。つまり、UE がオブジェクトを可視性があると見なすと、そのオブジェクトが GPU に伝えられ、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 で使用できるようにテクスチャとマテリアルを適宜設定してください。

変換メニュー オプション

  1. SVT を使用するよう変換するテクスチャ アセットをコンテンツ ブラウザ内で選択します。

  2. 右クリックしてコンテキスト メニューを開き、[Convert to Virtual Texture (バーチャル テクスチャに変換)] を選択します。

    CB_ConvertToVT.png

    このメニュー オプションを使用して、バーチャル テクスチャから通常のテクスチャへの変換を行うこともできます。

  3. [Convert To VT (VT へ変換)] ウィンドウに、選択されたテクスチャと、そのテクスチャを参照するマテリアルが列挙されます。

    CB_ConvertToWindow.png

  4. [OK] をクリックして変換プロセスを開始します。

変換プロセス中に、各テクスチャ アセットのテクスチャ エディタの設定に含まれる バーチャル テクスチャ ストリーミング が有効になります。選択したテクスチャを参照するマテリアルでは、Texture Sample (テクスチャ サンプル) ノードが非バーチャルサンプラ タイプではなく Virtual サンプラ タイプを使用するように変換されます。

手動での変換

  1. コンテンツ ブラウザで任意のテクスチャ アセットをダブルクリックし、そのアセットの テクスチャ エディタ を開きます。

  2. [Details (詳細)] パネルの [Texture (テクスチャ)] 以下の [Virtual Texture Streaming (バーチャル テクスチャ ストリーミング)] を有効にします。

    TE_EnableSVT.png

上述した 変換メニュー オプション を使用せずにバーチャル テクスチャ ストリーミングを有効にすると、変換済みのテクスチャを参照する既存のマテリアルは直ちに無効になります。問題のテクスチャを参照するマテリアルを開き、Texture Sample ノードが正しい Virtual サンプラ タイプを使用するように設定してください。たとえば、バーチャル テクスチャでは、[Sampler Type (サンプラ タイプ)] に [Color (カラー)] ではなく [Virtual Color (バーチャル カラー)] を使用します。

正しいサンプラ タイプを使用していない Texture Sample ノードがあると、 [Stats (統計)] パネルとノードの下部に、UE は次のようなエラー メッセージを表示します。

ManualConversionError.png

  1. エラー メッセージには、割り当てられた VT テクスチャ サンプル表現に含まれる不適切な サンプラ タイプ が示されます。

  2. テクスチャ サンプルの [Sampler Type (サンプラ タイプ)]Virtual タイプの 1 つに変更します。

  3. VT テクスチャ サンプルが適切にレンダリングされると、サンプル表現の右下に「VT」と表示されます。

バーチャル テクスチャをマテリアル グラフに追加すると、UE は自動的にバーチャル サンプラ タイプを割り当てます。ただし、テクスチャ サンプル表現をマテリアル インスタンスで使用できるテクスチャ サンプル パラメータにする場合は、基本のマテリアルではバーチャル サンプラ タイプがすべての子インスタンスに適用されることに注意してください。バーチャル テクスチャは、基本のマテリアルでバーチャル タイプになっていないテクスチャ パラメータ スロットに割り当てることはできないことを覚えておいてください。

UDIM のサポート

U-次元 (「UDIM」) はテクスチャの命名規則です。これにより、複数のテクスチャ画像を、スタティック メッシュ モデルまたはスケルタル メッシュ モデルの別個の UV 領域にマップできます。UDIM 命名規則を使用すると、画像ファイルのグループを UE がインポートして 1 つのバーチャル テクスチャ アセットとして扱うことができます。

UDIM でのバーチャル テクスチャリングのサポートは、次のような理由から有効です。

  • 非常に大きなテクスチャではなく、小さく多数に分けたテクスチャを操作します。

  • 各 UDIM 画像の解像度を変えて、ピクセル密度が一様でないバーチャル テクスチャを実現できます。

たとえば、4 つの画像ファイル (2048x2048 のテクスチャが 2 つ、128x128 のテクスチャが 2 つ) が 2x2 のパターンで配置された UDIM バーチャル テクスチャをインポートすると、バーチャル テクスチャでは論理的にこれらの画像を 1 つの 4098x4098 テクスチャとしてサンプリングします。UE では、ディスクやランタイム メモリの使用に影響を与えることなく、小さい 128x128 の画像は引き伸ばされて、大きい 2048x2048 の画像と同じ領域を埋めます。この場合、小さい 128x128 テクスチャで 2048x2048 テクスチャの解像度を埋めても、メモリを消費しません。

UDIM ワークフローの詳細については、「Foundry の UDIM ワークフロー」のチュートリアルを参照してください。

独自のプロジェクトで UDIM テクスチャを使用するには、次の命名規則に従ってください。

BaseName.####.[Support Image Format]

例:

MyTexture.1001.png

この命名規則に一致する画像をインポートすると、同じ BaseName に別の座標番号が付いた名前の画像が他にないかソース フォルダがスキャンされます。見つかった各画像は、4 桁の番号によって、UE がマップ先の場所を定義します。従来のテクスチャをインポートするとメッシュ UV の 0-1 の範囲にマップされますが、UDIM 画像は定義されている UV 座標を基に UV 0-1 にマップされます。

以下のグリッドは、画像の格納に使用できる、異なる 4 桁の座標への UV マッピングを表しています。

UDIM_Grid.png

UV 0-1 では 1001 に画像マップされ、名前付きテクスチャは MyTexture.1001.png になります。UDIM インデックス 1001 は、この画像のルートです。U 座標が変わり 1-1 になると、 MyTexture.1002.png になります。V 座標が変わり 1-2 になると、 MyTexture.1011.png になります。

パフォーマンスとコスト

プロジェクトのバーチャル テクスチャリングのパフォーマンスとコストを測定するには、以下のセクションに従ってください。

バーチャル テクスチャリングの統計を得る

統計情報を有効にするには、バッククォート (`) キーを使用してコンソールを開き、以下のコマンドを入力します。

バーチャル テクスチャリングのシーンのミリ秒 (ms) 単位のコストとページ テーブルのカウンタの詳細情報を確認するには、stat virtualtexturing を使用します。

Stat_VirtualTexturing.png

現在のシーンでのバーチャル テクスチャリングの使用に関連するメモリ カウンタを表示するには、stat virtualtexturememory を使用します。

Stat_VirtualTextureMemory.png

ストリーミング バーチャル テクスチャリングのビジュアリゼーション

ストリーミング バーチャル テクスチャを使ってミップのビジュアリゼーション グリッドをマテリアル設定に描画するには、コンソール コマンド`r.VT.Borders 1` を使用します。

Vis_VTBorders.png

必要がなくなった場合は r.VT.Borders 0 を使ってグリッドを非表示にします。

マテリアルのルックアップとスタック

マテリアルのバーチャル テクスチャからのサンプリングは、従来のテクスチャからのサンプリングより負荷がかかります。バーチャル テクスチャリングの負荷は、次の 2 カテゴリに分類されます。

  • ルックアップ はプロジェクトがマテリアル グラフにサンプリングするバーチャル テクスチャごとに発生します。

  • スタック は、プロジェクトが同じ UV とサンプラ ソースを使用する際にバーチャル テクスチャをまとめます。

常に、バーチャル テクスチャは従来のテクスチャ サンプルよりも負荷がかかります。常に、少なくとも 2 回のテクスチャのフェッチと、ある程度の計算命令が発生します。ただし、その負荷の一部は、同じ UV とサンプラ ソースを使う VT テクスチャ サンプルのスタック (最大 8 個) をまとめることで削減できます。

このシンプルなマテリアルの例では、UE はサンプリング対象のデフォルトの UV を使用して 2 つの VT テクスチャ サンプル表現があります。Virtual Texture Lookup がそのテクスチャ サンプルの各ルックアップに追加されると、どちらも 1 つの UV を使用しているため、1 つの Virtual Texture Stack にまとめられます。

VT_MatStats_1.png

ただし、プロジェクトで異なる UV が使用されている場合、Virtual Texture Stack のフェッチが 2 回になり、負荷が増大します。

VT_MatStats_2.png

1 つ目の例では、ルックアップが 2 回、スタックが 1 回で、合計で 3 回のテクスチャ フェッチが実行されます。どちらの VT サンプルも同じ UV を使用しているため、UE はスタックを組み合わせてテクスチャ フェッチを保存します。2 つ目の例では、2 回のルックアップと 2 回のスタックで、合計 4 回のテクスチャ フェッチが行われています。VT テクスチャ サンプルは Base Color と Normal のテクスチャ サンプルに異なる UV を使用しているため、1 スタックにまとめることができません。

マテリアルについての追記

  • UE はストリーミング バーチャル テクスチャをサイズに関係なく、テクスチャごとに固定サイズのタイルに分割します。また、タイル サイズによって最低解像度のミップを制限します。通常はこれが問題になることはありませんが、ノイズが多いテクスチャや非常に詳細なテクスチャでは、低解像度のミップがないために、エイリアシングやモアレ効果が発生する可能性があります。また、実際に測定することは困難ですが、GPU パフォーマンスの負荷も発生することに注意してください。

制限事項

基本的に、バーチャル テクスチャは通常のテクスチャと交換可能です。ただし、制限があったり、かかる負荷が増加します。

  • テクスチャの寸法は 2 乗にする必要がありますが、UE ではもともと正方形である必要はありません。ただし、現在の実装では、メモリの使用効率が向上しています。

  • ミップ間のトリリニア フィルタリングのサポートは、推計学的に処理されます。テンポラル アンチエイリアシング (TAA) を使用する場合は、通常のトリリニア フィルタリングとほぼ見分けがつきませんが、目に見えるノイズが発生する場合があります。

  • UE は異方性フィルタリングを [Tile Border (タイルの境界線)] 設定のサイズによって制限します。デフォルト値の「4」は、通常よりも弱い異方性フィルタリングがテクスチャに適用されますが、この値を大きくするとメモリ使用量が上がります。

  • VT ストリーミングは元来受動的です。つまり、レンダリングされるフレームに特定の VT タイルが必要になってはじめて、その VT タイルをロードする必要があることが CPU に認識されます。したがって、特に解像度の高い VT タイルがロードされる場合、カメラがシーンを移動するときに、目に見えるポップインが発生する可能性があります。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
閉じる