【UEFN】フォートナイトのLumenでライティングをリアルにしたい!(5/2更新)

フォートナイトのUEFNでもLumenを活用したい!
現在の映画やテレビなどのCG作成では、ハイダイナミックレンジの360度HDRI画像を使用して、非常に高い品質の環境ライティングを行うことが可能です。
このライティングは、高品質な一方、多くの計算時間がかかるため、ゲームなどのリアルタイムCGで使用することは、到底不可能でした。
しかし、EpicGamesは、この常識を打ち破り、リアルタイムで高品質な環境ライティングを行う新機能「Lumen」を開発し、UnrealEngine5に搭載しました。
その後、Lumenは、フォートナイトにもChapter 4から正式導入され、対応したPCでは非常に高品位なライティングが行えるようになっています。(でも、きっとみんなLumenのないパフォーマンスモード使ってる・・・。自分も実はパフォーマンスモ(以下略))

Lumen自体の説明は、Epicの篠山さんが書かれた以下のドキュメントが非常に参考になります。自分もこのドキュメントでLumenの概要を理解することができました!
また、以下のページでもLumen使用時のTipsをまとめて下さています。こちらも非常に参考になります。
上の2つのドキュメントはどちらもUnrealEngine5のものであり、UEFNにはあまりLumen周りの設定がありません。
そこで今回、360度のHDRI画像をSkyLightに適用した環境ライティングをUEFNで行い、どのようになるのか検証いたしました。
今回のテスト内容
まず、最初に画像内にカラーチャートが含まれている360度HDRI画像を探しました。

なぜカラーチャートがあるものが必要か?といえば、
ライティングに使用するHDRI画像の中にカラーチャートの映像が含まれていれば、CGのカラーチャートと、HDRI画像のカラーチャートの比較が容易にでき、どの程度の再現性でライティングできているのか検証することができるからです。(なんらかの基準がないと検証できない)
そのあたりの詳しい内容は、CGWorldで特集されたCGSLABさんの記事などを参考にしてください。
そこで、カラーチャートが含まれたHDRI画像がどこかで提供されていないか探していたところ・・・
ありました!
同じくCGSLABさんが、CGWorldのWeb上で公開してくれています!
それも、なんと、太陽光源を後処理で追加してくれています!(太陽光源はHDRIのレンジでは正確に再現できないため、別途、DirectionalLightなどで再現、SkyLightでは環境光の再現のみとするのが一般的なやり方)

さすがです、CGSLABさん!
そこで今回はありがたくこれを使用させていただき、HDRIを適用したSkyLightだけで、どこまでLumenがライティングできるのか、検証することとしました。
UEFNでの事前検証
HDRIで検証する前に、Lumenが本当にUEFNで動作しているか、簡単なシーンで確認することとします。
Lumenを使用するためにはフォートナイトの場合、DirectX12に設定する必要があります。そのため、エディターの描画設定もDirextX12ベースのSM6にしました。
(ソフトウェアレイトレースのLumenはDirectX11でも使用可能なはずで、DirectX12でしかLumen設定が使用できないのはフォートナイト独自の制限事項と思われます)

空間上に3つの球を置き、左の球は青色、右側の球は黄色で発光するようにマテリアルを設定します。 この2つの球が、真ん中の球とプレイヤーにどういった影響を与えるかを確認します。

エディター上では、Lumenが機能し、左右の球が真ん中の球に影響を与えている様子が確認できます。
では、フォートナイトゲーム内での動作を確認します。
フォートナイトのグラフィック設定は以下の設定で行っています。

ハードウェアレイトレーシングはオフにしています。 この項目がオフの場合は、おそらくDistanceFieldを使用したソフトウェアレイトレースが実行されることになるのだと思われます。
※UnrealEngineはMeshDistanceFieldといわれる情報を保存して、様々なことに使用しています 参考リンク
フォートナイトの実行結果はこのようになりました。

真ん中の球は左右からの影響を受けている
フォートナイト上でも、正しく左右の光が真ん中の球に影響を与えているようです。
スクリーンスペースグローバルイルミネーションなど、画面内に映っているものだけで行うフェイクの環境光表現がUnrealEngineにはあるため、こうしたスクリーンスペース系の処理でないことを確認するために、画角を変え、左右の球が画面にうつらない状態でも確認します。

左右の球が映っていない状態でも、真ん中の球は左右の光からの影響を受けています(①) 画面に映っているものに対してフェイクで環境光が足されているわけではなさそうです。
DistanceFieldを使用したLumenでは、DistanceFieldを持たないスケルタルメッシュ(キャラクターなど)へのLumenの効果は限定的になるとのことですが、キャラクターにも左右の光が影響を与えている様子を確認することができました。(②)
UEFNで作成したクリエイティブコンテンツでも、Lumenはきちんと動作可能なようです。
HDRIライティングテスト
シーンのセットアップ
では、いよいよHDRIを使用した環境ライティングのテストを行っていきます。 まず、シーンのセットアップです。
新規シーンを作成し、前回と同様にLumenExposureManagerを使用して、完全にマニュアル露出にします。(やり方は前回記事を参照)
SkyLightをシーンに追加し、そこにCGSLABさんのお台場のHDRI画像を適用します。


※CGSLABさんが提供してくださっているHDRI画像は、色域がACESのものでした。UEFNでは、現状ACESの色空間を扱う手法がないため、事前に別のソフトを使用して、ACESからLinearガンマ/sRGB色域の画像に変換したものを使用しています AfterEffectsの場合は、カラーコンバーターエフェクトを以下のように設定することになるはずです。

360度画像を絵として表示するため、Emissiveに360度画像を適用したマテリアルを作成してSphereに適用して背景画像を作ります。
この球が影を落とさないよう、CastShadowや以下の設定をすべてオフにします。

これで大きくシーン側の準備は完了です。
実行結果
では、フォートナイト上の実行結果です。
カラーチャートとしての再現性としては、完全一致しているとは言えないまでも、それなりに近い形で再現されています。

反対側から撮影したイメージがこちらになります。カラーチャートがこちらはないので、なんとも言えませんが、奥に映っているビルの陰の感じから判断するに、説得力のある形で陰影がついているように思われます。

地面に映る陰に関して、やはりSkyLightだけで表現するのはかなり難しく、この天候であればはっきりとした影が欲しいところですが、かなり柔らかい影表現になってしまっています。
ためしにSkyLightのCubeMap Resolutionを128から大きく上げてみました。多少は結果が変わりましたが、大きな変化はなく、あまり上げる意味はなさそうです。

ほぼ差は分からない
キャラクターに注目すると、輪郭の光が強く、その馴染みがあまりよくありません。
なぜだろうと思い、SkyLightをオフにして真っ暗にしてやりました。

「あれ?なんかリムライト表現がついている・・・・ライトは一つもないはずなのに・・・」
キャラクターをいくつか変えてみましたが、すべてのキャラクターで同様のため、キャラクターの問題でもなさそうです。
このリムライトを無理やり消すために、カメラを8STOP分(2の8乗=256倍)暗くし、ライトを256倍強くして消えないか試してみましたが、まったく変わらず、どうやらカメラの露出に関係なく、一定の強さのリムライト表現が適用されるようになっているようです・・・・。
おそらくLumen適用モードでは、さまざまな露出のシチュエーションでキャラクターを目立ちやすくするために、あえてこういった表現をいれているのではないかと予想します。
5/2更新
Fortnite 24.30のアップデートでキャラクターのリムライトが正しく設定されるようになり上記の現象は解決しました。

まとめ
今回は、LumenとSkyLight+HDRIのライティングに関して検証していきました。
SkyLightはキャプチャ機能のボタンがなかったり、まだ、未整備が部分も多くありますが、Lumenの環境光の能力はリアルタイムであると思えないくらい素晴らしく、大きく絵のクオリティを上げることができそうです。
直接光の部分もかなり健闘していますが、ここはやはりDirectionalLightで表現した方が良いのではないでしょうか。
今回うまくいっていないリムライト問題に関しては、もう少し追っていきたいと思います。
Lumenオンの状態で、リムライト表現をオフにする仕方がわかる人がいれば、ぜひ教えていただきたいです。
まだフォートナイトでのLumenを使用したライティングの検証については書き切れていない部分があり、引き続きLumenを使用したライティングについて追っていきます。
今後もRingoGamesではUEFNに関するさまざまな情報を発信していきます。Twitterでお知らせしていきますので、よろしければ、Twitterのフォローをしていただけると幸いです。
Twitterはこちら
UEFN 超楽しい :)