ストリーミング仮想テクスチャリング

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

Windows
MacOS
Linux

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

従来のミップベースのテクスチャ ストリーミングは、マテリアルの UV 使用量のオフライン分析を実行してから、実行時にオブジェクトの可視性と距離に基づいてロードするテクスチャのミップ レベルを決定します。このプロセスでは、すべてのテクスチャ ミップ レベルについてストリーミング データが分析されるため、パフォーマンスを制限する可能性があります。高解像度のテクスチャを使用する場合、ミップ レベルの高いテクスチャをロードすると、パフォーマンスとメモリのオーバーヘッドが非常に大きくなる可能性があります。また、ミップベースのテクスチャ ストリーミングは、CPU ベースのオブジェクトの可視性とカリングを使用して CPU によって決定されます。可視性は、ビューへのオブジェクトのポップインが発生しないよう、より保守的に (つまり、オブジェクトがロードされる可能性の方が高く) 解釈されます。したがって、オブジェクトのわずかな部分でも表示される場合は、オブジェクト全体が表示されるものと見なされます。オブジェクトは、ストリーミングが必要な可能性がある、関連付けられているテクスチャも含めてロードされます。

対照的に、仮想テクスチャリング システムでは、表示される必要があるテクスチャの部分のみがストリーミングされます。仮想テクスチャリングでは、まず、すべてのミップ レベルが小さな固定サイズのタイルに分割されます。可視のタイルのうち、画面上のすべての可視ピクセルによってアクセスされるタイルを GPU が特定します。つまり、オブジェクトが可視であると見なされると、そのオブジェクトが 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 Texturing Settings Reference (仮想テクスチャリングの設定リファレンス)」 ページを参照してください。

テクスチャとマテリアルを変換する

プロジェクトで仮想テクスチャリングを有効にする場合は、テクスチャとマテリアルが適切に機能するように設定が必要です。テクスチャでは 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] をクリックして変換プロセスを開始します。

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

手動での変換

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

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

    TE_EnableSVT.png

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

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

ManualConversionError.png

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

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

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

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

UDIM のサポート

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

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

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

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

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

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

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

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

例:

MyTexture.1001.png

この命名規則に一致する画像をインポートすると、同じ BaseName に別の座標番号が付いた名前の画像が他にないかソース フォルダがスキャンされます。見つかった各画像は、4 桁の番号によって、マップ先の場所が定義されています。従来のテクスチャをインポートするとメッシュ 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 個) をまとめることで削減できます。

このシンプルなマテリアルの例では、サンプリング対象のデフォルトの 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 を使用しているため、スタックがまとめられてテクスチャ フェッチを 1 回省略できています。2 つ目の例では、2 回のルックアップと 2 回のスタックで、合計 4 回のテクスチャ フェッチが行われています。VT テクスチャ サンプルは Base Color と Normal のテクスチャ サンプルに異なる UV を使用しているため、1 スタックにまとめることができません。

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

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

制限事項

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

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

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

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

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

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback