MegaLights は Unreal Engine 5 のまったく新しい直接ライティング パスであり、これによりアーティストは、以前より桁違いに多いダイナミックおよびシャドウ付きエリア ライトを配置できます。
MegaLights は最新世代のコンソールをサポートするように設計され、レイトレーシングを活用して、多様なタイプのエリア ライトからリアルなソフト シャドウを実現します。
MegaLights はダイナミックシャドウのコストを削減するとともに、シャドウなしライトの評価コストも削減します。これにより、コンソールで、テクスチャ付きエリアライトなど、負荷の高い光源を使用できるようになります。
MegaLights は、Volumetric Fog (ボリュメトリック フォグ) もサポートしています。
MegaLights を使用する
プロジェクト設定の [Rendering (レンダリング)] > [Direct Lighting (直接ライティング)] カテゴリから、プロジェクトの MegaLights を有効にできます。 ここで [Support Hardware Ray Tracing (ハードウェア レイトレーシングをサポートする)] も有効にすることが求められます。これは MegaLights の推奨設定です。
有効にすると、ローカル ライトはすべて MegaLights システムで処理されます。 MegaLights はライト コンポーネントの Allow MegaLights (MegaLight を許可) プロパティを使用してライトごとに無効にできます。 [MegaLights Shadow Method (MegaLights シャドウ メソッド)] を設定して、[Ray Tracing (Default) (レイ トレーシング (デフォルト))] または [Virtual Shadow Maps (バーチャル シャドウ マップ)] (VSM) をシャドウイングのソースとして選択することもできます。
仮想シャドウ マップが、簡素化されていない Nanite ジオメトリから直接シャドウをキャストする間に、エリアシャドウを近似するだけです。 事前にシャドウ マップ深度を準備するために、ライトごとに VSM に対して CPU、メモリ、GPU 時間のオーバーヘッドがあります。
単一プロジェクト内で、詳細レベルでコントロールするために、MegaLights をポストプロセス ボリューム設定を使用して有効/無効にできます。
MegaLights は、r.MegaLights.Allow 0 を使用して、スケーラビリティ レベルまたはデバイス プロファイルごとに無効にできます。
技術の概要
MegaLights は確率的直接ライティング テクニックであり、直接ライティングを解決しますが、ライトのサンプリングが重要になります。 重要な光源に対して、ピクセルごとに固定数のレイでトレースします。 光源にレイがヒットすると、そのライトの寄与が該当するピクセルに追加されます。
このアプローチには、複数の重要な意味があります。
直接ライティングは統合方式で単一パスにより処理されます。既存の複数のディファードレンダラ シャドウイングとシェーディング手法を置き換えます。
MegaLights はシャドウイングのコストを削減するとともに、シェーディング自体のコストも削減します。
MegaLights には一定のパフォーマンス オーバーヘッドがありますが、対象ピクセルで、ライティングの複雑度が高くなると、品質が低下することがあります。
ディファード シェーディングでは一定のライティング品質が確保されるため、GPU コストがライト数とともに増加します。 一方 MegaLights は一定のパフォーマンスであるため、その品質は対象ピクセルのライティングの複雑度で決まります。
MegaLights は次の機能を置き換えます。
シャドウマップ距離フィールド シャドウ
レイ トレーシングによるシャドウ
ディファード シェーディング (BRDF およびライトの評価)
ボリュメトリック フォグ シャドウイングとライトの評価
仮想シャドウ マップの投影
個別のライト アクタの設定でシャドウ メソッドが選択されている場合は、引き続き仮想シャドウ マップを MegaLights とともに使用できます。
デフォルトでは、MegaLights はまず、小さい細部をピックアップするために、短い控えめなスクリーン空間レイをトレースします。簡素化されたレイトレーシング シーンで利用できないことがあります。 そのようなレイが画面から外れる、オブジェクトの背後になる、または最大長に達すると、MegaLights はハードウェアまたはソフトウェア レイトレーシングを使用して、最後の有効な位置からトレースを続けます。 MegaLights を仮想シャドウ マップをレイトレースするようにも設定できますが、そのシャドウでは、事前の追加コストがかかります。これはシャドウ マップはライトごとに生成する必要があるからです。一方 BVH (レイトレーシング シーン) はシーンのすべてのライトに対して 1 回生成されます。
MegaLights でのレイガイディングは、重要な光源を選択するのに役に立ち、対象ピクセルに影響を及ぼす可能性があるライトにさらに多くのサンプルを送るためには重要です。 その代わり、レイガイディングは、オクルードされそうな影響が小さいライトにはサンプルをあまり送りません。 これがこの手法の重要な部分で、ピクセルあたり一定のライトサンプル バジェットから、可能な限り最高のライティング品質を引き出すことができます。 レイガイディングはオクルードされる光源に送られるレイ数を削減しますが、それでも現在のフレームで見えるかどうかをチェックするために、それらを定期的にサンプリングする必要があります。 この点に留意して、シーン全体に影響を及ぼす範囲が大きい光源の配置を避ける必要があります。
最後に、蓄積されたライティングすべてがノイズ低減機能に渡され、確率的でノイズが多い可能性がある入力から、高品質の直接ライティングの再構築を試みます。 シーンでライティングの複雑度が増えると、ノイズ低減機能で、さらに多くの処理を実行する必要があります。 ライティングの複雑度が増えると、ライティングのブラーにつながり、ゴーストを生み出すことがあります。これを回避して、最終ライティング品質を改善するには、小さい光源をマージして大きいエリアライトにして、光源の範囲を慎重に狭めます。
ライティングの複雑度
ノイズ低減機能に大きく依存する前に、単一ピクセルに影響を及ぼすことができる重要なライトの数に制限があります。ピクセルごとのサンプルの固定数と固定バジェットがあるからで、ノイズ低減機能でブラーのあるライティングを生み出し、結果としてシーンにノイズやゴーストを生み出す可能性があります。 ライトの減衰範囲を狭め、光源のクラスタを単一のエリアライトで置き換えることで、ライトの配置を最適化することが引き続き重要です。
シーン内で MegaLights をうまく機能させるために、最適なのはシーン ジオメトリ内でライトを配置することを避け、ライトの範囲を最適化することです。 コンソール コマンド r.MegaLights.Debug 1 を使用して、選択ピクセルからレイが送られる場所をビジュアル化できます。 コンソール コマンド r.ShaderPrint.Lock 1 を使用して、選択したレイをフリーズできます。これにより、トレースされたレイをシーンのさまざまな場所から調べることができます。
MegaLights は Unreal Engine の正式版の機能として開発されているため、追加のビジュアライゼーション ツールが利用可能です。
以下の例では、テクスチャ付き矩形ライトの一部は壁の内側にあり、常に見えるとは限らない場合でも、MegaLights によるサンプリングが必要です。 これはビジュアライゼーションで確認できます。壁の中でトレースされるレイの一部が表示されます。 理想的には、テクスチャ付き矩形ライトの [Source Width (ソースの幅)] と [Source Height (ソースの高さ)] を狭くして、光源がこのアーチを埋め尽くしつつも、アーチを越えて広がらないようにします。
ノイズを最小限に抑えるには、ジオメトリ内部にライトを配置することを避け、ライトの減衰範囲、スポットライトのコーン角、および矩形ライトのバーンドアを最適化し、ライトの影響を絞り込みます。
レイトレーシング シーン
デフォルトでは、MegaLights はレイトレーシングを使用し、シャドウ品質は、レイトレーシング シーンの表現の品質で決まります。 パフォーマンスについては、レイトレーシング シーンは自動で簡素化された Nanite メッシュを使用して構築され、メイン ビューよりも大胆なカリング設定を使用します。 これによりシャドウのアーティファクト、リーキング、シャドウの欠損が生じることがあります。
レイトレーシング シーンのビジュアライゼーションは、シャドウイング問題を調査するための優れた開始ポイントです。 MegaLights でレイトレースした、実際のシーンの表現が表示されます。 次のとおりレイトレーシング シーンをビジュアル化できます。
[Ray Tracing Debug (レイ トレーシングデバッグ)] 表示モードの 1 つは、レベル ビューポートの表示モード メニューにあります。 [Ray Tracing Debug (レイ トレーシングデバッグ)] 表示モードは、コンソール コマンド
show RayTracingDebug 1とr.RayTracing.DebugVisualizationMode = "World Normal"でも利用できます。[Lumen Overview (Lumen 概要)] 表示モード。レイ トレーシング シーンとメイン ビューを同時に表示できるピクチャーインピクチャー ビジュアライゼーションを有効にします。 [Lumen Overview (Lumen 概要)] 表示モードは、コンソール コマンド
r.Lumen.Visualize 1でも利用できます。
一部のシャドウが欠損または距離で消失する場合は、レイトレーシング シーンのカリングが原因である可能性があります。 r.RayTracing.Culling.* の下にあるコンソール コマンド群を使用して、カリングの調整を開始できます。 このときカリング モード、半径、立体角変数を確認します。
カリング目的で、小さいオブジェクトを Ray Tracing Group ID (レイ トレーシング グループ ID) を使用して、マージできます。マージされた範囲でまとめてカリングできるようにします。
レイ トレーシング シーンのカリング コントロールの詳細は、「レイ トレーシング パフォーマンス ガイド」を参照してください。
レイトレーシング シーンは自動的に簡素化された Nanite フォールバック メッシュに基づいています。 デフォルト設定では、シャドウイング目的としては品質が低すぎるフォールバック メッシュになることがあり、手動での調整が必要になることがあります。 このためには、次の手順を実行します。
対象メッシュをスタティックメッシュ エディタで開きます。
[詳細] パネルの [Nanite Setting (Nanite 設定)] で、[Fallback Target (フォールバック ターゲット)] を [Relative Error (相対誤差)] に設定します。
[Fallback Relative Error (フォールバックの相対誤差)] という新しい設定が表示され、その値を設定できます。 値を減らすと、三角形数が増え、Nanite フォールバック メッシュの忠実度が高くなります。
設定したら、[Apply Changes (変更を適用)] をクリックして、Nanite フォールバック メッシュを再ビルドします。
Nanite フォールバック メッシュの設定の詳細は、「Nanite 仮想化ジオメトリ」を参照してください。
レイトレーシング シーンに含まれる、Nanite フォールバック メッシュの三角形数とインスタンス数は、レイトレーシング BVH ビルド時間、使用メモリ、レイトレーシング パフォーマンスに影響を及ぼします。 プロジェクトで利用可能なパフォーマンスとメモリ バジェットにしたがって、それらを慎重に増やすことを推奨します。
非リアルタイム レンダリングでは、r.RayTracing.Nanite.Mode 1 を使用することもできます。これは Nanite メッシュの細部を全て使用してレイ トレーシング シーンをビルドするものです。 これには、高いパフォーマンス コストおよびメモリ コストがかかり、シーンやカメラ アニメーションの中で、Nanite LOD カットが変わり、その BVH で再構築が必要であるときに、ヒッチが発生することがあります。
スクリーン空間トレース
MegaLights は、大規模ジオメトリの細部にシャドウをキャストするときにレイトレーシング シーンを使用しますが、簡素化したレイトレーシング シーンで失われることがある、小規模のジオメトリにスクリーン空間トレースを活用します。 スクリーン空間トレースはシーン深度を使用し、画面上で可視であるどの対象にもヒットします。 これによりアートディレクションの何らかの調整が必要な問題が発生することがあります。シーン深度に影響がなく、レイトレーシング シーンにのみ存在する不可視のシャドウ キャスターなどがあります。
レイ トレーシング シーンの範囲を超えるトレースの場合 (またはファー フィールドの表現が粗すぎる場合)、MegaLights は遠距離の画面トレースをサポートします。 遠距離の画面トレースの長さは、r.MegaLights.DistantScreenTraces.Length を使用して、画面の比率として定義されます。
シャドウイング メソッド
MegaLights は 2 つのシャドウイング メソッドを公開します。これはライト コンポーネントのプロパティを使用してライトごとに選択できます。
レイ トレーシング はデフォルトであり、推奨メソッドです。 ライトごとに追加のコストがかからず、正確なエリアシャドウを実現できます。 マイナス面は、シャドウ品質が簡素化したレイトレーシング シーンに依存することです。
仮想シャドウ マップ は、仮想シャドウ マップに対するレイをトレースします。 仮想シャドウ マップは、ラスタライズを使用してライトごとに生成され、Nanite メッシュの細部を完全にキャプチャできます。 マイナス面はエリアシャドウを近似できるだけであるのと、シャドウ深度を生成するために使用されるメモリ、CPU、GPU のオーバーヘッドがライトごとにあるために大幅な追加コストがかかります。 これは慎重に使用する必要があります。
デフォルトでは、すべてのライト、特にソフトなシャドウがある大規模なエリア光源や重要ではないライトは、レイトレーシングを使用します。ソフトなライトでは正確なシャドウ キャスターが必要ないからです。 他に重要なのは、レイトレーシング シーンに少し多くのバジェットを割り当てることです。これは高品質のレイトレーシングの表現ではコストの低いレイトレーシング パスで多くのライトを処理できるからです。
ライト関数
ライト関数がサポートされるのは、ライト関数アトラス と互換性があり、ライト関数アトラスがプロジェクト設定で有効になっている場合に限ります。
アルファ マスキング
デフォルトでは、スクリーン空間トレースのみが、アルファ マスク サーフェスを正確に処理できます。 レイ トレーシングのアルファ マスキング サポートは、コンソール コマンド r.MegaLights.HardwareRayTracing.EvaluateMaterialMode 1 を使用して、有効にできます。 このオプションを有効にすると、自明ではないパフォーマンス オーバーヘッドがあり、したがって最適なのはコンテンツでアルファ マスキングを避けることです。
ディレクショナル ライト
デフォルトではディレクショナル ライトは無効になっており、r.MegaLights.DirectionalLights 1 を使用して手動で有効にする必要があります。 これはさまざまな制限によるもので、地平線まで伸びる高品質でシャープな太陽の影よりも、月光のような薄暗く柔らかい指向性ライトに適しています。
ディレクショナル ライト シャドウの質は、遠距離でのレイ トレーシングの表現に大きく依存していますが、これは BVH ビルドとトラバーサルのオーバーヘッドが原因で困難になる場合があります。 このような問題の一部は、[Far Field (ファー フィールド)] を有効にすることで隠すことができます。
強いディレクショナル ライトは、最終的なピクセルには影響しない目に見えないディレクショナル ライトに一部のサンプルをリダイレクトすることで、屋内にノイズを発生させることもあります。 これを回避するには、ポストプロセス ボリュームを配置して屋内のディレクショナル ライトを暗くしたり、無効にしたりすることができます。
ファー フィールド
MegaLights はファー フィールドトレースを実装します。単純化されマージされた HLOD1 メッシュに対してトレーシングすることにより、比較的低いオーバーヘッドで TLAS カリング範囲を越えてシャドウ レイの範囲を拡張できます。
ファー フィールド トレースは、「DefaultEngine.ini」構成ファイルのコンソール変数 r.MegaLights.HardwareRayTracing.FarField で有効化され、World Partition (ワールド パーティション) の Hierarchical Level of Detail (階層的詳細度) (HLOD) を使用する必要があります。 ファー フィールドをビルドするには、HLOD1 を使用する必要があります。
Lit Translucency (ライティングの透過処理) と Volumetric Fog (ボリュメトリック フォグ)
MegaLights は透過ライティング ボリュームおよびボリュメトリック フォグと統合し、これらのボリューム上のライティングやシャドウイングを確率的に評価します。
シャドウイングは、解像度が r.MegaLights.Volume.GridPixelSize と r.MegaLights.Volume.GridSizeZ で定義された統一フロクセル ボリュームを使用して計算されます。 ボリュームの適用範囲は、r.TranslucencyLightingVolume.OuterDistance とアクティブな Exponential Height Fog (指数関数的高さフォグ) コンポーネントの View Distance (表示距離) に基づいて自動的に拡張されます。
これらの設定を変更すると、ライティングの透過処理とボリュメトリック フォグの両方のシャドウイング品質に影響します。
Forward Shading (フォワード シェーディング)
現時点では、フォワード シェーディングは、ライティングの透過処理に使用されるのと同じボリュームを使用して計算されています。 特に、スペキュラ ライティングは、サーフェス周囲の全体的なライティングを近似する、球面調和関数から単一のライトを抽出することで近似されます。
パーティクル ライト
MegaLights は、パーティクル ライトをサポートしますが、現時点では Niagara システムでスポーンされるもののみをサポートしています。 MegaLights で処理されるパーティクル ライトは、シャドウ キャスティングを行うこともできます。
デフォルトでは、パーティクル ライトは、ユーザーがアセットで明示的に有効にした場合にのみ、MegaLights によって処理されます。 この動作は、コンソール変数 r.MegaLights.SimpleLightMode を使用して変更できます。この値を 2 に設定すると、MegaLights が全てのパーティクル ライトを処理します (シャドウ キャスティングはアセットごとに有効にする必要があります)。0 に設定すると、MegaLights からのパーティクル ライトが無効になります。
Niagara エミッタで MegaLights を有効にするには、次の手順を実行します。
エミッタの下にある Light Renderer (ライト レンダラー) モジュールを選択します。
Details (詳細) パネルで、Allow Mega Lights (メガライトを許可) と Mega Lights Cast Shadows (メガライトが影を落とす) を有効にします。
2 番目の設定をオンにすると、パーティクル ライトによってシャドウがキャストされます。
1番目の設定をオンにすると、スポーンしたライトに対して MegaLights が有効になります。
エミッタは多数のライトを生成する可能性があるため、画面のピクセルに同時に影響を与える強力なライトが多すぎないように注意する必要があります。 品質が著しく低下する可能性があります。 ライトを小さく、空間にまばらにし、少数のパーティクル ライトでのみシャドウ キャスティングを有効にすることをお勧めします。
スケーラビリティ
MegaLights のスケーラビリティのための主要なコントロールは、次のとおりです。
r.MegaLights.DownsampleModeは、サンプルとトレースのダウン サンプル係数を制御します。r.MegaLights.NumSamplesPerPixelは、ピクセルごとに実行されるサンプルとトレースの数を制御します。
ライティング品質をハイエンドPCやオフラインレンダリングと同等にスケーリングする機能はまだ開発中ですが、r.MegaLights.DownsampleMode 0 コマンドと r.MegaLights.NumSamplesPerPixel 16 コマンドを使用することで、最高の品質を実現できます。
ボリュメトリック フォグおよびヘア ストランドに対するライティングのスケーラビリティについては、r.megalights.volume.* にあるコンソール変数を使用して、それらのライティング品質を調整できます。
MegaLights は ムービー レンダー キュー 向けにカスタマイズしたサポートはまだありませんが、アンチエイリアシング メソッドとしてテンポラル スーパー解像度 (TSR) を使用する、またはテンポラル サンプル数を 8 程度に設定することで、ライティングを正確に解決でき、優れた結果を達成できます。
Performance (パフォーマンス)
パフォーマンスを比較するときに重要なのは、MegaLights はすべての直接ライティングを解決し、次の多様なディファードレンダラ パスを置き換えるという点を理解することです。
シャドウ深度: シャドウ マップまたは仮想シャドウ マップを使用する場合
RenderDeferredLighting::Lights
InjectTranslucencyLightingVolume
VolumetricFog::Shadowed Lights
ライトの評価を VolumetricFog::LightScattering から削除します。
パフォーマンスに影響を及ぼす要素:
パフォーマンスは内部レンダリング解像度に大きく依存します。
レイトレーシングは MegaLights のコストで 2 番目に高い部分になっています。 このコストが依存するのは、複数の要素に依存します。具体的には、レイトレーシング シーンのインスタンス数、その複雑度、各フレームで更新が必要なオーバーラップするインスタンスの量とダイナミック三角形の量です。 レイ トレーシング シーンの最適化の詳細は、「レイ トレーシング パフォーマンス ガイド」を参照してください。
ライトごとに、シャドウ マップ深度を生成するときに、メモリ、CPU、GPU に追加のオーバーヘッドがあります。これはシャドウイングに、レイトレーシングではなく、仮想シャドウ マップを使用します。
複雑な BRDF である画面上のピクセルに対して小さいコストがかかり、負荷の大きいライト タイプ (テクスチャ付き矩形ライト) で影響があります。
MegaLights のコストは多くの場合は一定で、シャドウなしとシャドウありでライトに大きな差はありません。つまりシーンのライトすべてで、シャドウを有効にできます。
理想的には、MegaLights は Lumen HWRT とともに使用することです。これにより、レイ トレーシング シーンのオーバーヘッドとシステム間の最適化を共有できます。
Stat GPU では、MegaLights パスを含め、GPU タイミングの概要を示します。 詳細のタイミングは、組み込みの ProfileGPU またはサードパーティ プロファイラを使用して取得できます。
Unreal Engine では多様な機能からの複数ディスパッチをオーバーラップするために非同期コンピュートを使用します。 Stat GPU と ProfileGPU のタイミングは、r.RDG.AsyncCompute 0 コンソール コマンドを使用して非同期コンピュートを無効にするまで、ひずんでいます。
MegaLights は完全に GPU 主導ですが、ライトごとに、レガシー CPU コストがそれでも多少あります。 全てのライトがレイ トレーシングを使用する MegaLights である場合、ライトごとの CPU コストの多くは、コンソール コマンド r.Visibility.LocalLightPrimitiveInteraction 0 を使用して取り除くことができます。
制限事項
一般制限事項:
MegaLights はフォワード レンダラと互換性がありません。
現在の制限事項 (改善予定):
プリミティブのインタラクションを追跡するときに、ライトごとのレガシー CPU オーバーヘッドがあります。この追跡は MegaLights で必要ありません。
ディレクショナル ライトのクラウド シャドウはサポートされていません。
サブサーフェス スキャッタリングの厚さの推定はサポートされていません。
水、雲、異種ボリューム、ローカル ボリュメトリックはサポートされていません。
プラットフォーム サポート
MegaLights の設計対象は、現行世代のコンソール (PlayStation 5、Xbox Series X、 | S) およびレイ トレーシング機能を備えた PC です。
MegaLights はモバイル、Switch または前世代のコンソール (PlayStation 4 や Xbox One など) をサポートしていません。