19.6K Views
February 20, 25
スライド概要
Lumen、Nanite中心に機能をおさらいしつつ、各機能を評価、活用するためにパフォーマンスの確認方法やアップデート情報を紹介
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Unreal Insights とProfileGPU から見る Lumen とNanite + UE5.4までのアップデート情報 Epic Games Japan Software Engineer, Developer Relations 澤田 祐太朗
Unreal Engine 5 (UE5) 5.0 5.1 Release 5.2 UE5.5 5.3 5.4
UE5のグラフィックスの強み
代表的な技術 Lumen GI(間接光や反射)を実現 MegaLights 直接光の処理の最適化 Nanite 高精細なメッシュを表示 VSM 高品質な影を描画 TSR 高解像度化 Experimental
MegaLights 直接光の処理の最適化 Experimental https://dev.epicgames.com/documentation/ja-jp/unreal-engine/megalights-in-unreal-engine
それぞれの機能を利用すべきかどうか ハイクオリティなグラフィックスを実現しやすくするツール アセットやLevel構築上の メリット 処理負荷や機能上の制限
本セッションの内容 ・Lumen、Nanite中心に機能をおさらいしつつ、 各機能を評価、活用するためにパフォーマンスの確認方法やアップデート情報を紹介 動作環境 UE: 5.4.4 CPU:AMD Ryzen Threadripper PRO 3995WX 64-Cores Memory: 256GB GPU: NVIDIA GeForce RTX3080
Lumen
Lumenの進化 品質やパフォーマンス向上に向けた積極的開発が行われている 5.0 ・Lumenの登場 5.1 ・コンソールで60hzを目指すための最適化 5.2~ ・非同期コンピューティングによる最適化 5.4 ~ ・HWRTもコンソール60hzを目指すために各種最適化
Lumenについて 非常に強力な機能ですが、注意すべき点もあります メリット ・GIをベイクなしで実現 ・ライトを動かす事も可能 ・ライトビルドコストの削減 デメリット ・時間軸上で蓄積した情報を活用するため、 残像などが起きやすい ・処理負荷
1フレームの中のLumen (Unreal Insights) r.Lumen.AsyncCompute 1 r.Lumen.AsyncCompute 0
非同期Compute処理を切る r.LumenScene.Lighting.AsyncCompute=1 : LumenSceneの計算 r.Lumen.DiffuseIndirect.AsyncCompute=1 : 間接光の計算 r.Lumen.Reflections.AsyncCompute=1 : リフレクションの計算
非同期処理も見る場合 NVIDIA NSight Graphics のGPU Trace Profiler
デバッグツールについて DumpGPUコマンドでバッファ中身を見る事が可能 Unreal Insightでは大まかなパス、時間を見る事が可能 ProfileGPUでより詳細なパス情報を確認可能 GPUDump Unreal Insights ProfileGPU
1フレームの中のLumen (Unreal Insights)
Lumen 処理の全体像 Lumen Scene Update Lumen Scene Lighting Lumen Screen Probe Gather Lumen Reflection Diffuse Indirect Composite
Lumen 処理の全体像 Lumen はLumen Scene と呼ばれる 簡素化したシーンを作りそこで GI成分等を求める Lumen Scene Update Lumen Scene Lighting Lumen Screen Probe Gather ソフトウェアレイトレーシング (SWRT) Distance Fields Lumen Reflection Diffuse Indirect Composite ハードウェアレイトレーシング (HWRT) Fallback Mesh
Lumen 処理の全体像 スクリーン上に Probe を配置し Lumen Scene を組み合わせて GI成分を求める Lumen Scene Update Lumen Scene Lighting Lumen Screen Probe Gather Lumen Reflection Diffuse Indirect Composite
Lumen 処理の全体像 Lumen SceneからReflectionを求める Lumen Scene Update Lumen Scene Lighting Lumen Screen Probe Gather Lumen Reflection Diffuse Indirect Composite
Lumen 処理の全体像 Diffuse Indirect Composite パスでコンポジット Lumen Scene Update Lumen Scene Lighting Lumen Screen Probe Gather Lumen Reflection Diffuse Indirect Composite
1フレームの中のLumen ( Unreal Insights) ProfileGPU Diffuse Indirect Composite
1フレームの中のLumen (Unreal Insights)
基本の設定はスケーラビリティから アセット単位の調整より全体の調整 Cinematic (シネマティック) ムービー レンダー キュー用設定 Epic 30 fps コンソール向け設定 High (高) 60 fps コンソール向け設定 Low (低) および Medium (中) Lumen 機能が無効になる
コンソール変数で調整が可能 Lumen パフォーマンスガイドに パス毎の各種軽量化用設定が紹介されている https://dev.epicgames.com/documentation/ja-jp/unreal-engine/lumen-performance-guide-for-unreal-engine
Lumenに関する過去の資料 https://www.docswell.com/s/EpicGamesJapan/51NY7K-UE_CEDEC2022_CitySampleRenderingOptimize https://www.docswell.com/s/EpicGamesJapan/5EV87K-UE5_Lumen10
Nanite
Naniteの進化 リリース当初にあった制限は徐々に減ってきている 5.0 ・Naniteの登場 - GPU駆動でRaster Pass(Vis buffer) と Material Pass(Base Pass)の分離 5.2 ・Programmable Rasterizer - MaskedやWPOの対応 5.4 ~ ・Compute Material ・Variable Rate Shading(VRS)
Naniteについて 対応環境をターゲットにしている場合は有効化をおすすめ メリット ・品質をスケールしやすい ・GPU駆動によるCPU処理コストの削減 ・対応環境のみであれば、LODメッシュ制作のコスト削減 ・Lumen、VSMなど各種機能に最適化されている デメリット ・GPUへのベースコストが多少ある ・Nanite非対応環境をサポートする場合は、別途LOD作成が必要
軽量メッシュでもNaniteは効果があるのか? ・UE5の各機能はNaniteに最適化されている面はあるものの、定常コストはかかる Nanite有効GPU: 9.21 ms r.nanite 1 Nanite無効GPU: 7.85 ms r.nanite 0 ・Soul CityのNanite化(Lumen&VSM込み) - 殆どのStatic Meshが1000ポリゴン程度
ポリゴン数の多いメッシュを配置した場合 約146万ポリゴンの木 303本プロシージャル配置
ポリゴン数の多いメッシュを配置した場合 Nanite無しの場合、適切なLODモデルを作れば改善可能。 自動で最適化されるのは便利 Nanite有効GPU: 10.28 ms r.nanite 1 Nanite無効GPU: 109.75 ms r.nanite 0 ・約146万ポリゴンの木 × 303本プロシージャル配置(Lumen&VSM込み)
軽量なシーンと重いシーンの比較 ポリゴン数の増大しても負荷増大はゆるやか Nanite有効GPU: 10.28 ms r.nanite 1 Nanite有効GPU: 9.21 ms r.nanite 1
1フレームの中のNanite (Unreal Insights) 1フレーム 14.2ms の中Nanite が大きく関係しているパスは 4つ 動作環境 CPU:AMD Ryzen Threadripper PRO 3995WX 64-Cores Memory: 256GB GPU: NVIDIA GeForce RTX3080
1フレームの中のNanite (Unreal Insights)
1フレームの中のNanite (Unreal Insights) 重要なのは VisBufferとBasePass 下2つは用途が違うだけで Naniteパスが動作している
Nanite Vis BufferとBasePass (ProfileGPU) 非常に多くのパスがあり 初見では分かりづらい
Nanite パスの全体像 Vis Buffer Culling Raster Vis Buffer で画面に見えるメッシュのみに絞り 詳細度を決め、映るピクセルを決める BasePass Material Material Material Passes Passes Passes 実際にMaterial を評価 GBuffer を作成する
Nanite パスの全体像 Material Material Material Passes Passes Passes Raster Culling BasePass Vis Buffer Instance Culling Hierarchical Culling Cluster Culling Raster Build HZB 2回似たパスが走っている Instance Culling Hierarchical Culling Cluster Culling Raster Build HZB
Nanite Vis Bufferの大枠 Main Instance Culling Nanite のVis Buffer はOcclusion Culling を 効率的に実施するために Main とPost の2パスで行われる Hierarchical Culling Cluster Culling Raster Build HZB Hierarchical Culling Cluster Culling Raster Build HZB Post Instance Culling
Nanite Vis Bufferの大枠 Main Instance Culling Nanite のVis Buffer はOcclusion Culling を 効率的に実施するために Main とPost の2パスで行われる Main Hierarchic al Culling Cluster Culling Raster Build HZB Hierarchic al Culling Cluster Culling Raster Build HZB Post Instance Culling Post
Nanite Vis Bufferの大枠 Main Instance Culling インスタンス (メッシュ毎 )のフラスタムカリングを行い 前フレームの HZBを利用して Occulusion Culling を行う Hierarchical Culling Cluster Culling Raster Build HZB Hierarchical Culling Cluster Culling Raster Build HZB Build HZB Post Instance Culling
Nanite Vis Bufferの大枠 Main Instance Culling Nanite メッシュで構築されている階層ノードでのカリング Hierarchic Hierarchical al Culling Culling Cluster Culling Raster Build HZB Hierarchical Culling Cluster Culling Raster Build HZB Post Instance Culling
Nanite Vis Bufferの大枠 Main Instance Culling クラスタでのカリング。レンダリングしたいクラスタをリクエスト Hierarchical Culling Cluster Cluster Culling Culling Raster Build HZB Hierarchical Culling Cluster Culling Raster Build HZB Post Instance Culling
Nanite Vis Bufferの大枠 Main Instance Culling 小さい領域の場合 SWラスタライズが行われる。それ以外は HW HW Hierarchical Culling Cluster Culling Raster Raster Hierarchical Culling Cluster Culling Raster Build HZB SW Post Instance Culling Build HZB
Nanite Vis Bufferの大枠 Main Instance Culling Post パスはMain パスで一度カリングされたインスタンスを 再度現在のフレームの HZBで再度Occlusion Culling 処理に投入 Hierarchical Culling Cluster Culling Raster Build HZB Build HZB Hierarchical Culling Cluster Culling Raster Build HZB Post Instance Instance Culling Culling
Nanite Vis Bufferの大枠 Main Instance Culling 最新のHZBでカリングされなければ Main と同様のパスでラスタライズ Hierarchical Culling Cluster Culling Raster Build HZB Hierarchic Hierarchical al Culling Culling Cluster Cluster Culling Culling Raster Raster Build HZB Build HZB Post Instance Instance Culling Culling
Nanite Vis Bufferの大枠 Main Instance Culling Post Instance Culling Hierarchic Cluster Raster al Pass は前フレームの HZBでオクルージョンカリング 最初のMain Culling Post Pass は現在の HZBでカリングされたものを再確認 Culling Build HZB 負荷となりやすい Raster パスを可能な限り減らしている Hierarchic al Culling Cluster Culling Raster Build HZB
Nanite パスの全体像 Vis Buffer BasePass Material Material Material Passes Passes Passes Raster Culling Instance Culling Hierarchical Culling Cluster Culling Raster Build HZB Instance Culling Hierarchical Culling Cluster Culling Raster Build HZB
Nanite パスの全体像 5.0 Vis Buffer Culling BasePass Raster Material Material Material Passes Passes Passes
Programable Rasterizerの追加 5.2 BasePass Vis Buffer New Culling Raster Binning Raster Raster Raster Masked 処理など Material に応じて ラスタライズ処理の振り分けを行う Raster Binning が追加 Shading Material Material Passes Passes Passes
Programable Rasterizerの追加 5.2 Vis Buffer BasePass New Culling Raster Binning ラスタライズ処理を複数に分解 Raster Raster Raster Shading Material Material Passes Passes Passes ラスタライズパスが増え Material の評価もあるため負荷は高くなる
Programable RasterizerパスのProfileGPU r.Nanite.ShowMeshDrawEvents 1 各ラスタライズパスをProfileGPUで確認可能に
Base Passについて Vis Buffer Culling Raster Binning BasePass Raster Raster Raster Shading Material Material Passes Passes Passes
Base Passについて Vis Buffer Culling Raster Binning BasePass Raster Raster Raster Shading Material Material Passes Passes Passes
Base Passについて Vis Buffer で求めた情報を元に Material を描画 Vis Buffer Culling Raster Binning BasePass Raster Raster Raster Shading Material Material Passes Passes Passes
Compute Shadingの対応 5.4 様々な最適化を行うためにシェーディング処理を Pixel Shader からCompute Shader へ BasePass Vis Buffer Culling Raster Binning Raster Raster Raster Material(Shading) パス部分の最適化 r.Nanite.ComputeMaterials 1 Shading Material Material Passes Passes Passes
Compute Shadingの対応 5.4 Shading Binning 処理でShading パスを振り分ける。 PS固定パイプラインの Shading Quad (2x2) の制限に囚われず、 ヘルパーレーンを埋めることができる Vis Buffer BasePass New Culling Raster Binning Raster Raster Raster Shading Binning Quad を前提としたマテリアル処理がある場合、 Quad Shading に動的に切り替える Shading Material Material Passes Passes Passes
NaniteのStats表示(Shading情報) r.ShaderPrint 1 r.Nanite.ShowStats 1 追加のVisualize機能 r.Nanite.Visualize.Advanced 1
CitySample (Compute Materialオンオフ比較) r.ShaderPrint 1 r.Nanite.ShowStats 1 r.Nanite.ComputeMaterials 1 r.Nanite.ComputeMaterials 0
CitySample (r.Nanite.ShadeBinningMode) r.Nanite.ShadeBinningMode 0 オートで切り替え r.Nanite.ShadeBinningMode 1 すべてQuad r.Nanite.ShadeBinningMode 2 すべてPixel
Variable Rate Shading(VRS)の対応 5.4 ハードウェア VRSはUE5.2 で対応していましたが ... 現在のNanite Compute Shading に合わせて実装 ハードウェア実装の VRSと比べても 画質に大きな違いがないまま良い結果がでている 機能の有効化 r.VRS.EnableSoftware 1 r.VRS.ContrastAdaptiveShadin g 1 追加のVisualize機能 r.VRS.Preview 3
Variable Rate Shading(VRS)の対応 5.4 r.VRS.ContrastAdaptiveShading 1 r.VRS.ContrastAdaptiveShading 0
Variable Rate Shading(VRS)の対応 5.4 r.VRS.ContrastAdaptiveShading 1 r.VRS.ContrastAdaptiveShading 0
Nanite Compute Material関連の情報について Take a deep dive into Nanite GPU-driven materials - Unreal Engine https://www.unrealengine.com/en-US/blog/take-a-deep-dive-into-nanite-gpu-driven-materials
Base PassのProfileGPU r.Nanite.ShowMeshDrawEvents 1 各シェーディングパスもProfileGPUで確認可能に おおまかに問題となっているマテリアルの特定が可能
Naniteパスについて 5.4 Vis Buffer Culling Raster Binning BasePass Raster Raster Raster Shading Binning Material Shading Material Passes Passes
1フレームの中のNanite (Unreal Insights) VisBufferとBasePass
1フレームの中のNanite (Unreal Insights) 2つのパスは簡単に紹介
LumenSceneUpdateのNanite LumenCard用Naniteパス (基本の流れは同じ)
ShadowDepthsの中のNanite VSM用のNaniteパス (基本の流れは同じ)
2回のShadowDepths 2回目のShadowDepthsが主にShadow Mapsの負荷 1回目のShadowDepthsは、 デフォルト無効化されている半透明SurfaceへVSMを使う場合のFront描画や VSM Page Build用パスが走る
1フレームの中のNanite (Unreal Insights)
各注意点 VisBuffer GPUカリングとはいえインスタンス数による負荷はある → WPのHLOD等で減らす ラスタライズは、Overdrawの削減や詳細度を下げることにより負荷削減 → r.Nanite.MaxPixelsPerEdge 1(大きくすると詳細度が下がる) 大量のMasked等はProgramable rasterizerパスが増えるため注意が必要 Base Pass これまで通り、マテリアルの複雑度によって負荷となるケースも → r.Nanite.ShowMeshDrawEvents 1 を設定した ProfileGPUを活用して問題のマテリアルを探す事が可能
まとめ 最近のバージョンにおけるLumenやNaniteの各パスの流れ、 Unreal Insight及びProfileGPUで確認できる項目を紹介 本講演がプロジェクト最適化の参考になれば幸いです。
Thank you!