Single Layer Water シェーディング モデル

物理ベースの水面のレンダリングで使用する Single Layer Water マテリアル シェーディング モデルの概要について説明します。

Windows
MacOS
Linux

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

Single Layer Water の実装

Single Layer Water シェーディング モデルは、カスタム レンダリング パスを使用して透明な表現を得ることができます。これには、[Opaque] または [Masked] のどちらかのブレンド モードを使用します。マテリアルの透過処理は、ベース パスおよびディファード ライティングの後で、通常の透過レンダリング、ポストプロセス、およびレンダリング パイプラインに含まれるその他すべての処理の前に実行されます。

Single Layer Water シェーディングは、不透明な水面またはマスクされた水面の効果を含む、散乱と Schlick 位相関数を使用する関与媒質の均一ボリュームです。水面の透明性は、ボリューム シェーディング モデルでは暗黙的です。屈折もボリューム関数で処理されます。ボリューム関数では、サンプルに歪みを加える前に水面下の深さと色を読み取ります。

マテリアル エディタでは、 Single Layer Water Material ノードに次の 4 つの入力があります。Scattering CoefficientsAbsorption CoefficientsPhaseG、 および Color Scale Behind Water です。これらの入力で、水の外観を定義します。水の半透明度はメインのマテリアル ノードの Opacity 入力で処理されます。この入力では、ボリュームの双方向散乱分布関数 (BSDF) およびサーフェスの双方向反射率分布関数 (BRDF) の比率を制御します。

RenderDoc を使用してフレーム キャプチャを実行することができます。これにより、GPU キャプチャで Single Layer Water パスが実行される場所を確認できます。Single Layer Water パスが実行される際には、BasePass はすでにレンダリングおよびライティングが行われています。完全にライティングされたシーンと深度は、Single Layer Water パスへの入力として使用され、バッファを読み取ることで、不透明なマテリアルまたはマスクされたマテリアルの屈折と半透明性を実現します。

slw_renderdocoutput.png

リストの最初の項目の前に、オプションのステップを使用して、シーンの色と深度バッファをダウンサンプルすることで、屈折を読み取ることができます。これによりレンダリングを高速化できます。ただし、水面下でレンダリングされたオブジェクトが若干ぼやけた (または解像度が低い) 外観になります。

  1. SingleLayerWater を使用したすべてのオブジェクトは、ユーザー定義マテリアルを使用して、GBuffer (深度を含む) にレンダリングされます。

  2. コンピューティング シェーダーが実行され、GBuffer 内の MaterialID に基づいて SingleLayerWater のすべてがタイルに分類されます。

  3. 生成されたスクリーン タイルは、間接的な描画である SSR (スクリーン スペース反射) パスに使用されます。このパスが実行され、別のバッファに出力されます。

  4. 生成されたスクリーン タイルは、再度、間接描画フル スクリーン パスを実行するために使用され、反射キャプチャ、空、新たに計算されたスクリーン スペース反射を水面の上に合成します。

ローエンド システムとモバイルでの Single Layer Water のサポート

モバイルやローエンドのデスクトップなど、ローエンドのシステムやプラットフォームでは、パフォーマンスを優先して Single Layer Water の機能の一部を省略した代替レンダリング パスが使用されます。最もシンプルな代替手法では、マテリアルを、ボリュームの統合やスクリーン スペース反射を含まないシンプルな半透明マテリアルに戻します。

Single Layer Water マテリアル出力を使用する

マテリアルを作成する際は、 [Details (詳細)] パネルで次のように設定します。

slw_materialsettings.png

  • Blend Mode: [Opaque] または [Masked]

  • Shading Model: SingleLayerWater

Single Layer Water Material 出力ノードをマテリアル グラフに追加します。この出力式では、光の散乱と吸収、異方的または等方的指向性 (PhaseG)、水面下のサーフェスの色の効果 (コースティクスやシャドウなど) に関する水の外観を定義します。

slw_materialoutputexpression.png

Scattering Coefficients (散乱係数)

Scattering Coefficients 入力は、媒質 (この場合は水) 内のパーティクルで光の散乱率を表します。媒質内で生じる光の散乱量により、媒質内のオブジェクトの光と色の外観が決定されます。コップの水やボトルの水など、媒質の中で散乱する量が少ない場合は、媒質が透明に見えます。媒質の中で光があまり散乱しないため、光が媒質の中を容易に進むことができます。散乱量が多いと、光がより多く散乱し、媒質の中を進むことがより困難になります。このため、オレンジ ジュース、ミルクなどのように、媒質がより濃く、より不透明に見えます。

散乱量は、光が媒質の中を進む方法に影響を及ぼし、この方法はオブジェクトがそのボリューム内にあるときの外観に直接影響します。たとえば、3 つのキューブ (赤、緑、青) が媒質内にあり、マテリアルが青い光だけを散乱させるように設定されている場合、散乱させないマテリアル (右) と比較して、散乱させた青い光がすべてのキューブの色にどのような影響を及ぼすかを (左) 確認してください。

slw_material_bluelightscattering.png

slw_material_nolightscattering.png

媒質内での青い光が散乱している状態

光がまったく散乱していない状態

この概念をデフォルトの Water Body マテリアルに適用して、まったく散乱しない場合と、ある程度の散乱が適用された場合とを比較して、その外観を確認してください。散乱しない場合、光は同じように跳ね返ったり、分散したりしないため、キューブは光が散乱しているときよりもはるかに下にあるように見えます。

高い散乱の量を使用すると、水がより厚みのある外観になり、一貫性が得られます。媒質の中を進む際に光がより多く散乱するため、深くなるほどオブジェクトが見えにくくなります。下の例では、光の散乱量を変化させた場合の効果を示しています。散乱量が比較的低い状態から非常に高い状態、さらには水面下のキューブの一部が見えなくなる状態まで変化します。

スライダをドラッグすると、増分的な散乱値 (0.5、1、2、4、8、16、32) により、散乱が増していく様子を確認できます。

Absorption Coefficients (吸収係数)

Absorption Coefficient 入力は、水 (または関与媒質) のボリュームに光がどれくらい容易に浸透するかを定義します。光の色チャンネル (RGB) または波長ごとに、水の透過性は異なり、あるものは他のものより優れています。その中を進む媒質に光が吸収されると、光は消滅し、色が失われます。オブジェクトが吸収係数の高い媒質の中で遠くまで進むほど、その色は失われる可能性が高くなります。

吸収係数では、光のどの色がより迅速に吸収されやすいかを制御します。吸収係数が小さいと、光が媒質の中を進みやすくなり、より透明な外観が得られます。係数が大きいと、光が媒質の中を進む際に、より早く減衰し、透明感の低い外観になります。

下の例では、3 つのキューブ (赤、緑、青) が媒質の中をより遠くまで移動します。これらの原色に適度な吸収係数 (赤 = 0.0033、緑 = 0.0016、青 = 0.0011) を使用した場合、媒質のより深いところに進むにつれて、各色が失われていくことがわかります。まず赤が消失し、次に緑、そして青が消失します。

上記と同じ値と設定で、デフォルトのウォーター マテリアルを使用すると、3 つの原色のキューブが水に深く沈むにつれて、それぞれの色が失われていきます。色は同じ順番で消えていきます。

デフォルトのウォーター マテリアルを使用すると、吸収係数の値が反対になります。値が小さいより、大きい方が、色がすばやく消失します。光がボリュームの中を進む距離は、逆数のメートルで表されます。つまり、1 をマテリアルの吸収距離で除算した結果として表されます。

距離の設定は次のようになります。

slw_absorptionmaterial.png

PhaseG 関数

PhaseG パラメータは、水中で光が散乱する全体的な前方向または後方向を制御します。より具体的には、このパラメータは太陽の方向を基準とした散乱光の異方的な指向性を制御します。

PhaseG は正または負の値を取り、正の値は太陽に向かって (前方に) 光が散乱する量を増やし、負の値は太陽から離れる方向に向かって (後方に) 光が散乱する量を増やします。これにより、現在のビューや空における太陽の位置に応じて、水が明るく見えたり暗く見えたりする効果が得られます。

slw_phaseg_neg075.png

slw_phaseg_05.png

PhaseG: -0.75

PhaseG:0.5

PhaseG の値が 0 の場合、その光の指向性は等方的です。これは、光が全方向に同一に散乱することを意味します。

位相関数は、特に波がある場合に、水の形状をより明確にします。これは、屈折が生じた後、ビュー レイの方向が変わり、水の中で散乱する光の量にバリエーションが追加されるためです。

Color Scale Behind Water (水面下のカラー スケール)

Color Scale Behind Water 入力は、水面下の輝度を制御します。このタイプのエフェクトを使用して、マテリアル内でコースティクスおよびシャドウの明るさや暗さを調整します。

下の比較画像では、水面下でコースティクスがどのように表現されるかを示しています。

マテリアルのコースティクス:無効

マテリアルのコースティクス:有効

これは単にマテリアルのビジュアル エフェクトで、ウォーター マテリアルの上に表示されます。水面下に移動しても、水面下の明るさが変わることはなく、これらのサーフェスに実際にコースティクスやシャドウイングが投影されることもありません。

水のオパシティ

Single Layer Water を使用するマテリアル設定を使用している場合、メインのマテリアル ノードの Opacity 入力は水の表示パラメータを制御します。オパシティの量は、ボリュームに光が入射し、散乱する量を制御します。また、ボリュームの中をどれだけ見通すことができるかを制御します。オパシティの値が大きいほどより不透明になり、光が水面に浸透しません。低い値では、すべての光が水面を通過するため、水の中ではるか遠くまで見通すことができます。

オパシティが低い (またはオパシティがない) と、Single Layer Water Material 出力式の他のプロパティが妨げられることなく機能します。下の表では、ウォーター マテリアルのオパシティになし、一部、最大といった値を設定することで、それぞれ、すべてまたは一部の光がボリュームのを通過するか、あるいは光がまったくボリュームを通過しなくなります。完全に不透明なマテリアル (オパシティ = 1) は、光が水面を通過して水の中に散乱することがないため、暗い外観になります。

slw_opacity_0.png

slw_opacity_05.png

slw_opacity_1.png

水のオパシティ:0

水のオパシティ:0.5

水のオパシティ:1

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