ウォーター メッシュ システムと水面のレンダリング

Unreal Engine での水面と水面メッシュのレンダリング方法の概要を説明します。

Windows
MacOS
Linux

ウォーター システムは、編集可能な水面と、水面マテリアルという 2 つの重要な要素で構成されています。これら 2 つの要素は、プロジェクト内の水の挙動や、水と接触するオブジェクトとの相互作用を決定します。これは、水面マテリアルが、その水面に接触したオブジェクトに光をどのように反射、屈折させるかといった単純な要素です。ゲームプレイでは、キャラクターが水の中を移動するときに水面に波紋を作成する方法や、オブジェクトが水面に浮くときの浮力などが挙げられます。

Water Surface メッシュ

ウォーター システムは独自のスプラインベースのメッシュ システムを搭載しており、ワールド内で水を含む必要のあるエリアを定義します。このシステムでは、 Water Mesh アクタ を使用して、レベルに配置されたすべての Water Body アクタ (川、湖、海) に適用されるプロパティを設定します。ウォーター メッシュは主に、レンダリングされる水面の品質とディテールを定義します。

Water Mesh アクタをシーンに配置して、レベルで Water Body (水域) タイプのサーフェスを生成する必要があります。Water Mesh アクタだけでは、サーフェスはレンダリングされません。Water Body はスプラインを使用して、レベル内で川、湖、海を表現する領域を定義します。スプラインは、Water Mesh アクタ によって Water Mesh タイルが描画され、レンダリングされる場所を定義します。これは、現在のカメラの視野内で見えるサーフェス メッシュのみをレンダリングするため、より効率的です。

シーンに Water Mesh アクタがある場合、Water Body をシーンにドラッグ&ドロップすると、水面を表すタイルが追加または削除されます。すべての Water Body は同一のメッシュを使用して水面をレンダリングするため、それらの Water Body はシームレスにブレンドされます (下図参照)。また、流れの急な川が穏やかな湖や大しけの海に流れ込むなど、異なるタイプの水面間の遷移を表現することもできます。

コンソール コマンド r.Water.WaterMesh.ShowWireframe 1 で Water Mesh ワイヤーフレーム ビューを有効にすると、異なる Water Body 間の遷移がどのように相互に作用して、シームレスなサーフェスを生成するかを確認できます。

Water メッシュ アクタ

Water Mesh アクタ は、レベルに配置された個々の Water Body のタイルを構成するサーフェス メッシュの品質を制御します。個々の Water Body には、レベルでのサイズに関する独自のハード リミットが設定されています。また、Water Body Ocean に固有の追加オプションも提供します。

watermeshactordetails.png

これらの設定は、高度にテッセレーションされたサーフェスや大きなエクステントを使用する際のパフォーマンスに大きく影響する場合があります。

ウォーター メッシュの詳細度のスケーリングとテッセレーション

詳細度 (LOD) またはウォーター メッシュ タイルは、フレームごとに四分木 (クワッドツリー) を走査して、スクリーン上に表示される最適化された一連のタイルを生成することで処理されます。その後、これらのタイルは、可能な限り詳細度ごとに折りたたまれ、重要な部分 (現在のカメラの視野に最も近い場所) の密度を上げたり、下げたりすることができます。

各詳細度は、距離に基づいたカメラの視野の周りの同心円で構成されています。詳細度が 1 レベル下がるごとにカメラから離れ、頂点数は 1 レベル上の詳細度の半分になります。

スタティック メッシュなどの従来の LOD ジオメトリでは、画面サイズに応じて詳細度がすぐに切り替わるため、切り替わるときにメッシュの遷移が目立っていました。ウォーター システムでは、メッシュ タイルで水面を表現しているため、詳細度が切り替わる際は、4 個のクワッドが単一のクワッドに変わり、高い詳細度に切り替わるときは、4 個のクワッドが 16 個のクワッドに変わるといったように、異なる LOD が相互に切り替わります (以下の例を参照)。

4x4 Quad Grid to 2x2 Quad Grid

Quad Grid Morphing Example Scene

4x4 のクワッド グリッドが 2x2 のグリッドに変わってから、元に戻る例。

フォートナイトでの水の LOD 遷移の例。

Water Mesh アクタでは、メッシュ タイルの詳細度のスケーリングとテッセレーションの量を明示的に定義するコントロールが提供されています。これらのプロパティはそれぞれ独立して機能します。ただし、パフォーマンスと水面の品質のバランスを適切に取るためには、これらのプロパティを同時に設定する必要があります。

同心円状の各詳細度のサイズ半径は、 LODScale プロパティで制御されます。このプロパティは、タイルが低い詳細度への切り替えを開始する必要のあるカメラからの距離を設定します。

Tessellation Factor では、タイルの頂点数を増やすことで、レベルに配置されているすべての Water Body のメッシュ タイルの品質のレベルを設定します。Water Body Ocean や Water Body Lake は、特に大きな山と低い谷を持つ波がある場合、より多くのテッセレーション量を設定することで最も大きなメリットを得られます。

これらのプロパティを設定する際には、次のようにバランスを調整することが重要です。

  • プレイヤーがより細かいディテールを見ることができるように、近くでは高品質にする

  • プレイヤーにとって必ずしも重要でない遠景は低品質にする

  • テッセレーション品質のパフォーマンス コスト

なお、ウォーター マテリアルには、ウォーター システムがテッセレーションで処理する必要のない細かいディテールも含まれていることがあります。

ウォーター タイルのビジュアライゼーションを有効にするには、次の方法を使用できます。

  • レベル ビューポートで、 [Brush Wireframe (ブラシ ワイヤーフレーム)] 表示モードを使用する。これは、シーンにたくさんジオメトリがない場合や、表示されているウォーター メッシュしかない場合に適しています。

  • 次のコンソール コマンドを使用して、ウォーター メッシュをワイヤーフレームとしてレンダリングする。

    • r.Water.WaterMesh.ShowWireframe 1 では、すべてのウォーター メッシュをワイヤーフレームとして表示します。

    • r.Water.WaterMesh.ShowWireframeAtBaseHeight 1 では、すべてのウォーター メッシュを平らな底部高の位置に表示します。

ウォーター メッシュのタイル サイズ、エクステント、および遠距離

Water Mesh アクタでは、レベルのウォーター メッシュを構成する個々のタイルのサイズを定義するオプション、アクタごとのタイル数を定義するオプション、空と水が接する海における長距離を処理するオプションを提供しています。

WaterMeshTileSettings.png

Tile Size プロパティは、ウォーター メッシュを構成する個々のタイルのサイズを設定します。これらはデフォルトのワールド単位で測定されます。タイル サイズを大きく/小さくすると、レベル内のウォーター メッシュを構成するすべてのタイルがスケーリングされます。

graph_gridtilesize.png

graph_gridtilesize_example1.png

graph_gridtilesize_example2.png

タイル サイズのグリッド例

ウォーター メッシュのタイル サイズ:2400 (デフォルト サイズ)

ウォーター メッシュのタイル サイズ:1000

Extent in Tiles プロパティは、ウォーター メッシュを構成する個々のタイルの数を設定します。エクステントは、ウォーター メッシュの中心から XY 軸方向の端までを測定します。

graph_gridtileextents.png

graph_gridtileextents_example1.png

graph_gridtileextents_example2.png

タイル エクステントのグリッド例

タイルのエクステント:64 (デフォルト サイズ)

タイルのエクステント:32

Far Distance を使用すると、Extent in Tiles プロパティで使用されている最も遠くのタイルと水平線との間の空間を埋めることができます。これにより、頂点数の少ないのウォーター メッシュが追加され、Water Body Ocean タイルが無限に広がっているような錯覚が生まれます。

graph_fardistance.png

graph_fardistance_example.png

遠距離グリッドの例

遠距離ウォーター メッシュが有効な場合

この遠距離ウォーター メッシュは、Water Body Ocean の基底高の位置のすぐ下に配置されているため、クリッピングが制限され、シームが表示されるのを回避できます。また、遠距離ウォーター メッシュは、Water Mesh アクタの Far Distance Material 割り当てスロットに適用する必要のあるマテリアルも使用します。このマテリアルはシンプルなもので構いません。実際、必要なのは、タイリングされたウォーター メッシュとのシームレスなブレンドを作成するために色を一致させることのみです。

Far Distance Mesh Extent プロパティを使用して、簡略化されたメッシュがどのくらい拡張されるかを設定します (ワールド単位)。

下の例では、Water Body Ocean を使用して、地上から Water Body がどのように見えるかを示しています。Water Body が水平線 (左) に達していないように見えることを確認してください。Water Mesh アクタの Far Distance プロパティは、このギャップを埋め、Water Body と Far Distance メッシュとの間にシームレスな外観を作成します。

Water Mesh アクタで Far Distance が無効になっている場合

Water Mesh アクタで Far Distance が有効になっている場合

上空の視点から、高度にテッセレーションされているウォーター メッシュがどこで終わっているのかがよくわかります。色が一致している Far Distance メッシュを使用すると、シーンを簡単に塗りつぶすことができ、詳細なウォーター メッシュをシームレスに一致させると同時に、パフォーマンスへの影響を軽減できます。

Water Mesh アクタで Far Distance が無効になっている場合

Water Mesh アクタで Far Distance が有効になっている場合

Water_FarMesh という名称のベースのウォーター マテリアルの簡略化されたマテリアル インスタンスは、コンテンツ ブラウザの「Water Content/Materials/WaterSurface」フォルダにあります。

ウォーター マテリアルと水中ポストプロセス

ウォーター システムでは、水面のレンダリングや、川が海に流れ込むなどの異なるタイプの Water Body (水域) 間の遷移を処理するために、複数の異なるタイプのマテリアルを使用します。また、ウォーター システムでは、ポストプロセス マテリアルを使用して、水面下の表現を定義します。

各 Water Body にはマテリアル割り当てスロットがあります。このスロットを使用すると、事前に設定されたデフォルトのウォーター マテリアルをオーバーライドできます。

underwaterpostprocesssettings.png

Water Body アクタ マテリアル

Water Body River、Water Body Lake、Water Body Ocean はすべて、同一のマテリアル (Water_Material) をベースとして使用しています。このマテリアルには、各 Water Body タイプに固有のスイッチとパラメータが含まれており、単一のソース マテリアルを使用して、使用されるすべてのタイプの水を制御することができます。マテリアル インスタンスは、Water Body タイプ (River、Lake、Ocean) ごとに作成されます。また、各マテリアル インスタンスにより、Water Body タイプに対応した使用可能なパラメータを特定するスイッチが有効になります。このワークフローにより、各 Water Body タイプのマテリアルに一貫した外観とデザインが維持されます。

下の画像では、フロート値、RGBA カラー、マテリアル パスの有効/無効を切り替えるスイッチなどのパラメータがどのように定義されているかを確認できます。パラメータは子のマテリアル インスタンスからアクセスできます。子のマテリアル インスタンスは、親マテリアルのパラメータをオーバーライドすることで、マテリアルの外観を変更できます。

スイッチおよびパラメータを備えるベース マテリアル

オーバーライド スイッチとパラメータを使用したマテリアル インスタンス

画像をクリックするとフルサイズで表示されます。

Lake、Ocean、River のいずれかのマテリアルを使用する Water Body タイプでは、ほとんどのマテリアル パラメータが共通しています。ただし、River のマテリアルは例外です。River マテリアルには、速度、フロー コントロール、密度など、他の Water Body のマテリアルにはない固有のパラメータがあります。ただし、Water Body River には、Water Body Ocean および Water Body Lake にある波のパラメータはありません。

コンテンツ ブラウザの「Water Content/Materials/WaterSurface」フォルダを開いて、各 Water Body タイプのマテリアル インスタンスを確認してください。

Water Body River のマテリアルの遷移

Water Body River では、水がある場所から別の場所へスプライン パスに沿って移動することができます。また、Water Body River は湖、海、川、またはその組み合わせを起源とすることができます。湖や海とは異なり、川は水が流れる全般的な方向が決まっています。湖から出発して、海や他の湖に流れ込むこともあれば、途中で別の川に合流することもあります。

川は、湖や海とは異なる特徴があります。つまり、波が発生しないため、Water Body River では、 川から湖 および 川から海 への遷移をシームレスに融合させるために、トランジション マテリアルを使用しています。Water Body River は、Water Body Lake および Water Body Ocean と同一のタイル メッシュを共有しているため、Water Body が接している他の Water Body のサーフェスにトランジション マテリアルを適合させることができます。

トランジション マテリアルは、Water Body River のデフォルトのマテリアル インスタンスです。レベルの水の外観に一貫性を持たせるために必要な唯一の設定は、使用されている他の Water Body Lake、Water Body Ocean、および Water Body River のマテリアルに手動で色を一致させることです。

以下のシーン例では、中心に Water Body Lake、島を囲む Water Body Ocean、それらを結ぶ Water Body River を含むランドマスを使用しています。トランジション マテリアルでは、湖から川へと水の流れが始まり、海に流れ込むところまでを処理します。各 Water Body とトランジション マテリアルは、一貫性を保つために色を一致させています。

waterbody_rivertransitions.gif

水中ポストプロセス

プロジェクトによっては、水の重要な側面として、水面の上から下への遷移があります。ウォーター システムでは、ポストプロセスを使用してこれを処理します。

Water Body にはそれぞれ 水中ポストプロセス マテリアル が割り当てられており、 ポストプロセス マテリアル を使用して水面での遷移を制御します。水中ポストプロセスは、カメラが特定の Water Body の境界内にあり、水面下に沈んでいる場合に自動的に実行されます。また、ポストプロセス マテリアルは、水中ではないシーンの部分をマスクして、部分的に水中のビューを作成することで、水面下および水面上への遷移を処理します。

water_underwaterpostprocessing.png

各 Water Body の [Details (詳細)] パネルには、このアクタ固有の設定が含まれており、 [Post Processing Settings (ポストプロセス)] 設定にアクセスできるため、マテリアルのプロパティを開いて手動で設定することなく、水中の外観を詳細に調整することができます。

water_underwaterpostprocessingmaterialslot.png

最適化のため、水中ポストプロセスは、カメラが水面下または水面より少し上にあるときにのみ行われます。これは、波の山や谷によってカメラが完全にまたは部分的に水面下に沈む湖や海を考慮しているためです。この水中ポストプロセスを機能させるためには、 [Generate Collision (コリジョンを生成)] を有効にする必要があります。

また、Water Body のタイル メッシュは、Water Body River のトランジション マテリアルを使用してシームレスにブレンドすることができます。ただし、水中ポストプロセスの外観が 2 つの Water Body 間で大きく異なる場合 (澄んだ川から濁った湖への移行など)、カメラが 2 つのポストプロセス ボリューム間を移動する際にスムーズではない遷移が発生します。

Single Layer Water マテリアル シェーディング モデル

Single Layer Water (単一レイヤー ウォーター) シェーディング モデルは、単一深度レイヤーを使用して負荷に対してパフォーマンスの高い透過処理手法をレンダリングするため、すべてのデフォルトのウォーター マテリアルで使用されます。この物理ベースのシェーディング モデルは、水面での適切な光の散乱、吸収、反射、屈折、シャドウイングをサポートします。

Water_singlelayerwatermaterial.png

Water Body に割り当てられているデフォルトのウォーター マテリアルはすべて、Single Layer Water シェーディング モデルを使用しています。Water Body では、どのシェーディング モデルでも使用できます。

このシェーディング モデルの詳細については、「Single Layer Water マテリアル シェーディング モデル」を参照してください。

独自のウォーター マテリアルを作成する

ウォーター システムで適切に機能する独自のウォーター マテリアルを作成することができます。その場合、各 Water Body に割り当てられているデフォルトのウォーター マテリアルを特に使用する必要はありません。

独自のマテリアルを設定する場合は、次の点に注意してください。

  • Water Body では、あらゆるタイプのシェーディング モデルを使用するウォーター マテリアルをサポートします。

  • このマテリアルでは、[Used with Water (水で使用)][Usage Flag (使用フラグ)] が有効になっている必要があります。マテリアルが異なるタイプのアクタに割り当てられると必ず、このフラグが自動的に有効になり、マテリアルが再コンパイルされます。再コンパイルされていない場合で、マテリアルが正しくレンダリングされないときは、このフラグが有効になっていることを確認してください。

  • SingleLayerWater シェーディング モデルは、従来の半透明マテリアルよりも低い負荷で、透過処理とライティングの結果を得ることができます。

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