1.1M Views
June 21, 22
スライド概要
UE5の新機能であり動的なグローバルイルミネーションを実現するLumen。このLumenを最大限活かすため、内部動作やそのクセを説明します。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Unreal Engine 5 Lumenの仕組みと肝心なところ Epic Games Japan Developer Relations Lead Nori Shinoyama
Unreal Engine5では 新たなライティングのシステムとして Lumenが導入されました
Next-gen visuals - Lumen 完全に動的なグローバルイルミネーション ライトもワールドも動的変更が可能 ベイクなし、ライトマップUVなし
動的なGlobal Illuminationを実現 オフィシャルドキュメントより
屋外から屋内まで柔軟に対応可能 オフィシャルドキュメントより
エミッシブマテリアルからのライティングも オフィシャルドキュメントより
ReflectionやSpecularも オフィシャルドキュメントより
Lumen Features ● Diffuse の相互反射 ● ● ● ● ● 無限のバウンス スカイライトからの影 インダイレクト スペキュラリフレクション ● ● Color Bleeding 間接的な影 マルチバウンスディフューズリフレ クション 対応プラットフォーム ● PC/PS5/XSX. XSS Cover this box completely - and exactly!
・・・どうやって? ・・・気にするべきことは?
本セッションの目標 基本的なアルゴリズムを理解して... ● ProfileGPUなどで出てくるLumen関連の処理の大まかなイメージをつかむ ● Debug Viewの各種意味を理解する ● Editorの設定がLumenの何を設定しているか? ● Option: 有用もしくは知っておくべきTipsの紹介 Lumenの描画クオリティとパフォーマンスチェックのとっかかりに...
Lumenの設定の仕方などは、オフィシャルドキュメントを。。。
備考 ※Lumenは映像で見た方がわかりやすい例が多く、動画へのリンクとして私篠山 のTwitterへのリンクが貼られています。Twitterをやられていないかたも、リン ク先で動画を見ることが可能ですので、参考にして頂ければ幸いです。
目次 ● ● ● ● GI計算はなんで重たいのか? Lumenのアルゴリズム概要 Lumenに関係する各種設定 Lumenの各種TIps (URL紹介のみ)
GI計算はなんで重たいのか?
ライティングは大きく2つに分けられる Direct Lighting Indirect Lighting
直接光 (Direct Lighting) ライトからの直接(Direct)のライティング 二次反射以降がないので影部分は黒い。
直接光 (Direct Lighting) とある点のライティング結果が知りたいとき... ライトからの影響だけを計算すればよい
間接光 (Indirect Lighting) 二次反射。照り返し。複数回バウンドしたライティング 直接光で届かない場所へも、光が回り込む。
間接光 (Indirect Lighting) どこからくるのかわからない... ライトの複数回反射を事前にシミュレートしておく必要がある とある点のライティング結果が知りたいときは... シーン全体を見に行く必要がある
参考: 反射/映り込み (Reflection) 反射や映り込みもGIと同様。とある点の反射を得るためには... シーン全体から反射する部分(とその部分のシェーディングも!)を 取得する必要がある
今までのGI計算方法
事前計算によるテクスチャへの焼き付け(Lightmap) 建築ビジュアライズにおけるLightmass実践使用方法: Slide, Youtube
事前計算によるテクスチャへの焼き付け(Lightmap) ● 動的な変更はできない ● ビルド時間数時間単位で増大 ● Lightmap用のテクスチャによ るメモリ消費 建築ビジュアライズにおけるLightmass実践使用方法: Slide, Youtube
Screen Space Global Illumination (SSGI) ● スクリーン上の明るい部分から擬似的 にGIを計算 ● スクリーン内の情報しか見ないため 直接光成分が画面から消えると、GIが 消失 ● 画面外を考慮する必要がないため軽量 だが、あくまで擬似的な効果のため、 メインのライティング環境としは使い にくい https://youtu.be/yHqLFVMQO6k?t=982
Path Tracer ● 正確な計算で最高品質の絵を生み出せる ● ただし、1フレームで完結せず、ノイズ の多いフレームがだんだんと綺麗になっ ていく ● つまり、ユーザがインタラクティブに操 作できるコンテンツには不適であり、 長時間のレンダリングを許す静止画/動 画などのオフラインレンダリングのため の機能 https://www.youtube.com/watch?v=NMalVTkoy2c
今まではどう対処してきたか? 1. 事前計算によるライトマップ作成 a. b. 夜などに何十時間かけてGIを計算。テクスチャに焼き付け。 動的変更不可 2. スクリーン上のみ考慮するGI (SSGIなど) a. b. スクリーン上での疑似GI。 スクリーンに映っていないものは寄与しない。非常に限定的なもの 3. 動画/静止画向けのPath Tracing a. b. c. d. 本気で全レイを正直に計算する。 物理的に一番正しい結果 リアルタイムでは無理 建築や動画向け 結論: 現世代GPUでも、GIをフル解像度/1フレームでレンダリングするのは無理
目次 ● ● ● ● GI計算はなんで重たいのか? Lumenのアルゴリズム概要 Lumenに関係する各種設定 Lumenの各種TIps (URL紹介のみ)
Lumenのアルゴリズム概要
アルゴリズムの肝である二点 この二点を解決する必要がある 1. シーン全体のライティングを事前にシミュレートするか? 2. 事前にシミュレートされた世界からGI/Reflectionを取得するか?
アルゴリズムの肝である二点 この二点を解決する必要がある 1. シーン全体のライティングを事前にシミュレートするか? 2. 事前にシミュレートされた世界からGI/Reflectionを取得するか?
Lumen Scene? ● ● LumenがGIやReflectionを計算するための簡易的なシーン シーン全体のライティングはこのLumen Sceneで計算及び構築される ● シーン全体... つまり、スクリーン外のオブジェクトのライティングも計算しなければいけな いため、簡略化のための様々な工夫がされている 実際のシーン LumenがGI計算に参照するシーン LumenScene
シーン全体の描画の難しさ 画面から見える世界だけじゃなく、 画面外のオブジェクト達も、しかも360度描画しないといけない どのようにこのオブジェクトを 360度ライティングしてデータを格納する?
事前計算でメッシュを覆うカードを作成 Card = 各Meshを包含する平面群 このカードをオブジェクトの描画スクリーンとする
City Sampleのカード
Lumen Sceneの構築とライティング 各メッシュの カード形状作成 事前準備 (Editor)
Lumen Sceneの構築とライティング 各メッシュの カード形状作成 事前準備 (Editor) 視点やサイズに応じて オブジェクトを選定 ランタイム
Lumen Sceneの構築とライティング 各メッシュの カード形状作成 事前準備 (Editor) 視点やサイズに応じて オブジェクトを選定 マテリアル情報などを 各カードに書き出し アトラス化 ランタイム
Lumen Sceneの構築とライティング 各メッシュの カード形状作成 事前準備 (Editor) 視点やサイズに応じて オブジェクトを選定 マテリアル情報などを 各カードに書き出し アトラス化 ランタイム ライティング!
Lumen Sceneのライティングは シーン全体のDeferred Renderingと言えるかも。。。 Lumen Scene Lighting Deferred Rendering
Lumen Sceneのライティングは シーン全体のDeferred Renderingと言えるかも。。。 Lumen Scene Lighting 各オブジェクトの Deferred Rendering
Lumen Sceneのライティングは シーン全体のDeferred Renderingと言えるかも。。。 Lumen Scene Lighting 各オブジェクトの Deferred Rendering マテリアルや位置情報 を書き出し。。。
Lumen Sceneのライティングは シーン全体のDeferred Renderingと言えるかも。。。 Lumen Scene Lighting 各オブジェクトの Deferred Rendering マテリアルや位置情報 を書き出し。。。 ライティング!
Surface Cache? Surface Cache カードから抽出されたマテリアルデータやライティング結果
Tips: 複数回バウンスの実現 Lumen Scene内で、直接光を計算後に、 Radiosity法を用いてLumen Scene内での 複数回バウンスを実現している
Tips: 複数回バウンスの実現 Lumen Scene 複数回バウンスなし (Radiosity: Off) Lumen Scene 複数回バウンスあり (Radiosity: On)
注意: カードでは描画できない部分ができる可能性 上記の様なカードだと 内側はカードに描写できない (マゼンダ部分) Lumen Scene内部では その部分はシェーディング情報 がないので黒く表示される
アルゴリズムの肝である二点 どのように。。。 1. シーン全体のライティングを事前にシミュレートするか? -> Cardsで簡易表現されたLumenSceneで計算する 2. 事前にシミュレートされた世界からGI/Reflectionを取得するか?
アルゴリズムの肝である二点 どのように。。。 1. シーン全体のライティングを事前にシミュレートするか? -> Cardsで簡易表現されたLumenSceneで計算する 2. 事前にシミュレートされた世界からGI/Reflectionを取得するか?
低解像度のライティング情報(Radiance Cache)を算出し、 フルスクリーンのNormalやBRDFによって最終的な結果を算出する
この低解像度Radiance情報を、LumenSceneをレイトレースして見積もる
どうやってシーンを トレースするか?
二つのトレース方法 1. Distance Field 2. Hardware RayTracing Project Settingsで Use Hardware Ray Tracing when availableを設定することに よりHardwareRTを使用できるGPUではHadwareRTを使用
Distance Field ? ● 事前計算で作成する オブジェクトの簡易表現 ● 長所 高速にトレースできる ● ● 短所 ● ● 事前計算により変形不可 正確なオブジェクトの形状を 得ることができない
Hardware Ray Tracing ● 専用ハードウェアを用いた より正確なトレーシング ● 長所 正確にトレースできる ● ● 短所 ● ● DistanceFieldに比べ高負荷になりがち ハードウェアレイトレが動く 最新のGPUが必要
Distance FieldのLumen Scene
Hardware Ray TracingのLumen Scene
Distance Fieldを採用
Hardware Ray Tracingを採用
※LumenはDistance Field依存の技術ではない トレーシングできればどんなデータ構造でもアルゴリズムでも良い ハードウェアレイトレだけでもLumenはできます。ルーメンの全体の中のト レーシング部分をハードウェアレイトレがやるだけなので、従来のレイトレ GIなどのような劇的に重たくはなりません
Advance: DFを読み込まないためのCVar ● r.DistanceFields.SupportEvenIfHardwareRayTracingSupported ハードウェアレイトレオン使用時、 このCVarを0にして起動するとDistanceFieldが読み込まれません。 DsitanceFieldに関連する機能が一切使えなくなりますが、 メモリの劇的な削減につながります。
Distance Field vs Hardware Ray Tracing お互いの違いを理解してどちらを使うか決める必要があります 特に以下の三点に注意 ● ● ● 処理負荷 データの差 存在できるもの/できないもの
Distance Field vs Hardware Ray Tracing 処理負荷 一般的にはHWRTの方がDistance Fieldよりも重いと言われています 特にHWRTではレイトレ用のシーン構築コストやメモリがかかります しかし、EpicはMatrix Demoを経て様々な最適化をHWRTにも行っております。 HWRTは重たいと決めつけて無視せず、 やりたい表現に沿ってプロファイリングをまずすることをお勧めします
Distance Field vs Hardware Ray Tracing データの差 Distance Fieldはあくまでオブジェクトの簡易表現であり、 実際のポリゴンメッシュ程の正確性を持てません。 鏡の様なクリアな映り込みはDistance Fieldでは実現できません。 Distance Field HW Ray Tracing
Distance Field vs Hardware Ray Tracing 存在できるもの/できないもの Distance Fieldは事前計算されるデータなので、 SkeletalMeshなどDistance Fieldを持てないものは反映されない Distance Field HW Ray Tracing
Distance Field vs Hardware Ray Tracing 他にも多くの制限があります! シーンのデザインや作成方にも影響するので、 それぞれの長所短所を理解し色々試してみてください!
LumenのTraceのに関するTips
Distance Field: Detail TraceとGlobal Trace ● Distance Fieldの計算では、近距離にある各メッシュをDetail Traceした後、 ヒットしなければGlobal Traceをするようにしている ● Detail Trace ● ● ● ● Global Trace ● ● ● ● 各オブジェクトのDistance Fieldを見てレイのヒットを計算 複数のDistance Fieldを見るので比較的処理が重い ● 特に沢山のオブジェクトが重なるシーンでは。。 Global Distance Fieldに比べて精度が高い ワールド全体のDistance Fieldを合成した大きな”Global Distance Field”をトレーシング 一つのDistance Fieldを見るだけなので比較的処理が軽い しかし精度は非常にラフ Project SettingでDetail Traceを使用するかを設定可能
Distance Field: Detail TraceとGlobal Trace くっついている 模様が消失 Detail Trace Global Trace
Distance Field: Detail TraceとGlobal Trace くっついている 模様が消失 Detail Trace Global Trace
Distance Field: Detail TraceとGlobal Trace Detail Traceはいる?? Lumen Sceneで見ると、クオリティに大きな差が。。。 Detail Trace https://twitter.com/tempkinder/status/1529991835845685248 Global Trace
Distance Field: Detail TraceとGlobal Trace Detail Traceはいる?? 実際のシーンで見るとあまり気にならなかったり。。。 Detail Trace https://twitter.com/tempkinder/status/1529991835845685248 Global Trace
古代の谷サンプルでは、メッシュが多く重なるため Detail Traceの負荷が高くなる、そのためGlobal Traceのみを採用
Tips: Screen Trace Lumenはデフォルトでは、最初にScreen SpaceのTraceをし、 Screenの外に出る必要がある場合にDFかHWRTのトレーシングを行います。 Detail Trace Ray 発射! Screen Trace Global Trace Distance Field Hardware Raytracing Ray Trace そのため、スクリーン系エフェクト固有の不具合が見られる場合があります。 そういった場合、Screen Trace自身をオフにすることも検討した方が良いかもし れません。
Tips: Screen Traceによる誤った映り込み https://twitter.com/tempkinder/status/1503174649718329349
Lumenのアルゴリズムまとめ
Lumen Algorithm まとめ 各メッシュの カード形状作成 事前準備 (Editor)
Lumen Algorithm まとめ 各メッシュの カード形状作成 事前準備 (Editor) Lumen Sceneの構築と ライティング ランタイム
Lumen Algorithm まとめ 各メッシュの カード形状作成 事前準備 (Editor) Lumen Sceneの構築と ライティング レイトレで GIを計算 ランタイム
Lumen Algorithm まとめ 各メッシュの カード形状作成 事前準備 (Editor) Lumen Sceneの構築と ライティング レイトレで GIを計算 ランタイム アップサンプリング!
Lumenのリアルタイム性について
Lumen Sceneの構築と ライティング レイトレで GIを計算 アップサンプリング! これ本当に1フレームで計算できる???
Lumen Sceneの構築と ライティング レイトレで GIを計算 内部の様々な処理をフレーム分散して 1フレーム内の処理を減らしている!! アップサンプリング!
主な分散項目 ● ● ● スクリーンのGI計算部分(Final Gather)を行うライトプローブの数 Surafece Cacheに書き込こまれたマテリアルのアップデート Lumen Sceneのライティング フレーム分散するということは、 ライティングの変化に遅延が発生する可能性があるということ...
フレーム分散による遅延例 https://twitter.com/tempkinder/status/1526037005364174850 カメラの切り替え時の遅延
フレーム分散による遅延例 https://twitter.com/tempkinder/status/1503976333365301248 ライティングの高速な変化に対する遅延
フレーム分散による遅延例 https://twitter.com/tempkinder/status/1502821055202693126 マテリアルの変更による遅延
Lumen Sceneの構築と ライティング レイトレで GIを計算 アップサンプリング! (負荷は上がるが)遅延を改善させる様々なパラメータがあります 詳細は後のTips集で...
最適化の観点から見たLumenのアルゴリズム メッシュとシーンの 簡略化 それぞれ個別に フレーム分散 低解像度化
最適化の観点から見たLumenのアルゴリズム 1. オブジェクトの簡略化 (Card / Surface Cache) ● ● オブジェクトの複雑さがライティングの負荷に直接影響しないようにする Naniteオブジェクトと併用するためにも必須 2. 計算の複数フレーム分散 ● 代償として若干にじむように 3. 低解像度化 ● 高度なアップスケーリング技術の活用
目次 ● ● ● ● GI計算はなんで重たいのか? Lumenのアルゴリズム概要 Lumenに関係する各種設定 Lumenの各種TIps (URL紹介のみ)
Profile / Debug View / 設定
Profile GPU ● 事前にLumen Sceneの更新 ● ● 入るオブジェクトの算出 Cardの更新 ● Surface Cache (= Lumen Sceneのライティング) を更新 ● Screen上のProbeからGIを計算 ● ● ● スクリーンにライトプローブを置き Final GatherでLumen Sceneをトレース BentNormal/ G-Bufferからフル解像度に
Debug View
Debug View: Surface Cache Surface Cacheデータを表示 ● ● マゼンダ ● Surface Cacheで計算できなかった部分 黄色 ● Surface Cacheに入っていないオブジェクト
Debug View: Lumen Scene Lumen Sceneの表示 ● Surface Cacheに入っていない部分は ライティング情報を取得できないため 真っ黒になっているのがわかるかと思います
注意点: Surface Cacheに入ってないのはだめ? City Sampleでも、意外とPinkや黄色が多い。 最終的な絵の結果を重視した方がよさそうです
Lumen Gl Post Processing Setting LumenSceneのライティング時の Radiosity計算用Probeの解像度を定義 Lumen Sceneに入れるオブジェクトの 距離と画面上の大きさを設定 GIのクオリティ調整 各シーンの更新頻度変更 1フレーム内での処理負荷増減
主要なパラメータの変化を、 わかりやすいように動画にしました 検証した動画へのリンクを貼っておきますので そちらご参照頂けると幸いです
Final Gather Lighting Update Speed https://twitter.com/tempkinder/status/1503976333365301248
Lumen Scene Lighting Update Speed https://twitter.com/tempkinder/status/1504266200276037634
Lumen Scene Lighting Quality https://twitter.com/tempkinder/status/1504264596852391939
Final Gather Quality https://twitter.com/tempkinder/status/1503687508554440704
番外編: Static Mesh Editor内カード設定 各メッシュ最大どれくらいのカードを作成できるか?
目次 ● ● ● ● GI計算はなんで重たいのか? Lumenのアルゴリズム概要 Lumenに関係する各種設定 Lumenの各種TIps (URL紹介のみ)
Lumenは幅広いシーンでの活用を想定 ● オープンワールドの広大な レンダリングから ● 屋内の局所的な レンダリングまで ● インタラクティブなゲーム から静止画動画まで
そのためか内部の設定を非常に細かく制御できます lumenを調整するCvarだけでも200を越える....
Twitterに投稿しQiitaにまとめています なるべく逆引きできる形式を目指して日々得た知見を追加して います。ご参考にして頂けると幸いです。 ● ● ● ● ● ● ● ● Lumenのライティングのもやもやを改善したいとき Lumenのライティングの変化のスピードをあげたいとき Emissiveオブジェクトなど影響が大きいオブジェクトを 必ずLumenの計算に含めるようにする設定 LumenのReflectionで半透明が変に映り込んでいるとき SkeletalMeshのオクルージョンなどがLumenのGI内で出 ないとき LumenをHardwareRayTracingのみで使用しDistance Fieldを読み込まない方法 Lumen上でのキャラクタなどの動的物体の反射の注意点 (Hardware Ray Tracing使用時) etc… https://qiita.com/EGJ-Nori_Shinoyama/items/b6ac447162afb134fbc4
まとめ ● Lumenは動的GIをリアルタイムで実現する非常に強力なUE5の新機能です ● そして、様々なシーンに対応するために、処理負荷やクオリティのバランスを 柔軟に設定することが可能です ● 特にハイクオリティなビジュアルや厳密な処理負荷の制御が必要な場合、 内部挙動をある程度理解しておくと調整の時間を削減できます ● このドキュメントが内部挙動の理解の助けになれば幸いです そしてLumenは今も鋭意開発されています!これからの改善にもご期待ください!
おしまい