可動ライト ソースからのシャドウイングは、それぞれの剛体メッシュに対して 距離フィールド オブジェクトを使用して、動的な光源からの効率的なエリア シャドウイングを計算することで表現されます。 Unreal Engine では、これを Distance Field Shadows (距離フィールド シャドウ) (DFS) と言います。シャドウイングを計算するために、シーンの Signed Distance Fields (SDF) (符号付き距離フィールド) を使用して、シェーディングされるポイントから各ライトに向かってレイ (光線) がトレースされます。 遮蔽オブジェクトへの最短距離を使用して、レイトレースとほぼ同じ負荷のコーン トレースを近似します。これにより、球体をした光源からの高品質なエリア シャドウイングを実現できます。
シーン セットアップ
この機能を使用するには、 [Rendering (レンダリング)] セクションの [Project Settings (プロジェクト設定)] で [Generate Mesh Distance Fields (メッシュ距離フィールドの生成)] を有効にしておく必要があります。 詳しくは、「メッシュ距離フィールド」 ページを参照してください。
距離フィールド シャドウイングを有効にするには、ライト をシーンにドラッグし、その [Mobility (可動性)] を [Movable (ムーバブル)] に設定します。その後、ライトの [Details (詳細)] パネルから、[Distance Field Shadows (距離フィールド シャドウ)] を有効にします。

設定手順についての詳細は、「距離フィールド シャドウイングを使用する」 のガイドを参照してください。
エリア シャドウイングの設定
それぞれのライト タイプは距離フィールド シャドウを使ってソフトエリア シャドウを投影します。これらのシャドウは、基点に近づくほど鮮明に、また遠くに延びるにつれてソフトにすることにより、現実世界の影をシミュレートしています。


光源の設定に関する追加情報やさらなる例は、「メッシュ距離フィールドページを参照してください。
ポイント ライトとスポット ライトの光源の半径
ポイント ライトとスポット ライトの場合は、Source Radius (光源の半径) を使用して、ポイント ライトのシャドウの半暗部の大きさを決定します。エリアシャドウは、近づくにつれ鮮明になり、遠ざかるとソフトになるように計算されます。 ポイント ライトおよびスポット ライト上では、黄色い球体で表されます。

エディタは光源の形状を黄色の線で描画します。
ライトの光源の半径は、シーンと交差しないようにしてください。ライティング アーティファクトが生じてしまいます。


距離フィールド シャドウは、玄関、ベンチ、ピアノが周囲のジオメトリにキャストするシャドウをソフトにするため、光源の半径を使用してポイント ライトから投影されます。
スポット ライトの設定に関する追加情報やさらなる例は、「メッシュ距離フィールドの設定のリファレンス」 ページを参照してください。
ディレクショナル ライトの光源の角度
ディレクショナル ライトの場合は、Light Source Angle (光源の角度) を使用して、ライトのシャドウの半暗部の大きさを決定します。 距離フィールド シャドウは自己交差の問題はほとんどなく、したがって、従来のシャドウマッピングに蔓延していた遠方での漏れと過剰バイアスを回避します。


光源の角度をよりソフトなシャドウイングに調節したディレクショナル ライトから距離フィールド シャドウを投影した場合。
ほとんどの場合、ディレクショナル ライトの動的シャドウイングを表現するために Cascaded Shadow Map (カスケード シャドウ マップ) (CSM) が使用されています。このため、カスケード シャドウ マップ (シャドウイング用の LOD) では、 シーン内のメッシュをいくつかのカスケード シャドウ マップにレンダリングする必要があります。シャドウイング負荷は、シャドウの距離が伸びると急増します。 これはシャドウ マップにレンダリングされるメッシュと三角ポリゴン数が増えるためです。
距離フィールド シャドウは、可視ピクセルに対してのみシャドウイング処理を行うため、遠方では非常にうまく機能します。カスケード シャドウ マップはカメラに近い領域に影を投影します。このとき、 RTDF シャドウが設定されている 距離フィールド シャドウの距離 まで投影されます。


距離フィールド シャドウを有効にすると、カスケード シャドウ マップの距離 に対して設定した値を超えるシャドウが距離フィールドによって 投影されるようになります。CSM と RTDF シャドウイングの両方を使って比較しましょう。 CSM シャドウを 1,000 CM (センチメートル) に設定すると、カメラ付近のシャドウはさまざまなディテールが追加されて鮮明になります。1,000 CM を超えると、RTDF によるシャドウイングが使用され、 1.2 KM (キロメートル) 先までシャドウ オブジェクトの投影が可能になります。これにより、カスケード シャドウ マップでは負荷が大きすぎる場合に木の影を遠方へ投影できるようになります。
ディレクショナル ライトの設定に関する追加情報やさらなる例は、「メッシュ距離フィールドの設定のリファレンス」 ページを参照してください。
シーンの表現
作成する各レベルは、設置したアクタに対してこれらすべてのメッシュ距離フィールドで構成されています。メッシュ距離フィールドは、結果をボリューム テクスチャに格納するトライアングルのレイトレーシングを使用して「オフライン」で生成されます。そのため、メッシュ距離フィールドの生成は実行時に行うことができません。このメソッドでは、符号付き距離フィールドの光線をすべての方向で計算し、最も近いサーフェスを探してその情報を格納します。
ビューポートを使用して [Show (表示)] > [Visualize (視覚化)] > [Mesh Distance Fields (メッシュ距離フィールド)] を選択すると、シーンを表現するメッシュ距離フィールドを視覚化することができます。
ビジュアライゼーションを有効にするメニュー | メッシュ距離フィールドのビジュアライゼーション |
画像をクリックすると拡大表示されます。
グレイより白いエリアが多く表示されるときは、メッシュ サーフェスの交点を探すために必要な手順が多数あることを意味します。サーフェスに対するグレージング角の光線は、シンプルなメッシュの場合に比べると交差させるための手順が多く必要になります。
メッシュ距離フィールドの品質
距離フィールドシャドウの忠実度は、距離フィールド アンビエント オクルージョン よりもシャドウの精度に大きな影響を及ぼします。 メッシュ距離フィールドの解像度を高くするとスタティックメッシュから投影されるシャドウの質が上がります。品質のチェックには [Mesh Distance Field Visualization (メッシュ距離フィールドのビジュアリゼーション)] を使用します。
次の例は、距離フィールドの解像度が異なる距離フィールド シャドウイングがあるシーンです。


次の例は、距離フィールドの解像度が異なるメッシュ距離フィールドのビジュアライゼーションがあるシーンです。


メッシュ距離フィールドのシャドウは、深度に配慮したアップサンプリングによって 1/2 解像度で計算されます。Temporal Anti-Aliasing (テンポラル アンチエイリアシング) (TAA) は、1/2 解像度によるフリッカーを減らすうえで非常に効果的ですが、 シャドウのジャギーは表示されることがあります。
メッシュ距離フィールドの品質に関する追加情報は、「メッシュ距離フィールド」ページを参照してください。
パフォーマンス
以下の GPU のタイミングは、フルゲーム シーンにおいて解像度 1920x1080、Radeon 7870 で行われます。
テスト | カスケード/キューブマップ シャドウ マップによる負荷 (ms) | 距離フィールドシャドウによる負荷 (ms) | 速度比 (%) |
---|---|---|---|
ディレクショナル ライトが 10k ユニット、3 x カスケード シャドウ マップの場合 | 3.1 | 2.3 | 25% |
ディレクショナル ライトが 30k ユニット、6 x カスケード シャドウ マップの場合 | 4.9 | 2.8 | 43% |
半径の大きいポイント ライト 1 つ | 1.8 | 1.3 | 30% |
半径の小さいポイント ライト 5 つ | 3.2 | 1.8 | 45% |
最適化
以下は、距離フィールド シャドウイングの最適化のためにできること、または考慮すべきことです。
- ディレクショナル ライトは、光源の角度 が大きくなるほどそれぞれの投影ポイントに対して考慮すべきオブジェクトが増えるため、負荷が高くなります。
- 距離フィールドシャドウの距離 の値が大きくなると、カリングの効率が低下します。
- Two-Sided Distance Field Generation (両面距離フィールドの生成) ([Build Settings (ビルド設定)] で有効化) を使用しているメッシュからのシャドウは、シャドウが完全な不透明にはならないため、負荷が高くなります。
-
[Project Settings] \> [Rendering] で有効にします。
画像をクリックすると、拡大表示されます。
-
[Compress Mesh Distance Fields (メッシュ距離フィールドの圧縮)] を有効にすると、圧縮された距離フィールド ボリューム テクスチャをメモリに格納できます。これによりメモリ使用量を削減することができますが、レベル ストリーミングを使用している場合は、これらのレベルがストリーミングされる際にゲームプレイで処理落ちが発生します。
-
[Eight Bit Mesh Distance Fields (8 ビットメッシュ距離フィールド)] を有効にすると、距離フィールド ボリューム テクスチャをデフォルトの 16 ビット浮動小数点ではなく 8 ビット固定小数点形式で格納することができます。この設定ではメモリを半分しか使用しませんが、大きなメッシュ、または薄いメッシュがあるとアーティファクトが発生します。
-
-
グローバル距離フィールドでは、[Mobility (可動性)] が [Static (スタティック)] または [Stationary (ステイショナリー)] に設定されている場合に静的プリミティブをキャッシュします。グローバル距離フィールド全体は主に静的キャッシュから派生しているため、移動可能なプリミティブが修正されると、付近の他の移動可能なプリミティブのみがグローバル距離フィールドへの再合成を必要とします。
制限事項
距離フィールド シャドウイングがメッシュ距離フィールドの技術の一般的な制限と同じになりました。これらの制限の詳細については、 「メッシュ距離フィールド」 ページを参照してください。