マイケル
エレキベア
マイケル
今回は久しぶりにUnrealEngine5 を触ります!
UE5の中でも特に強力なグラフィックス機能である、
Nanite、Lumen、VSM について簡単に触れていきます。
エレキベア
マイケル
これらの機能を活用した
CitySample なんかは一時期話題になったよね。
UE5のリアルタイムグラフィックスのクオリティの高さはこれらの技術により実現されているといっても過言では無いと思います。
エレキベア
こんな大量のオブジェクトをリアルタイム描画できるなんてすごいクマ~~
マイケル
Nanite、Lumen、VSMの機能は相互に関係しあっていて、最適化含めグラフィックス機能を扱う上での知識として必要 になります。
今回はそれぞれの機能の概要についてまとめて、雰囲気を掴んでみます!
エレキベア
参考書籍・サイト
マイケル
Nanite関連について詳しく触れている書籍は多くなく、公式ドキュメント以外だと下記スライドを参考にさせていただきました。
いずれも同じ著者が書かれていて、頻繁な更新が行われる機能をこのようにまとめていただけているのは非常にありがたいです!
エレキベア
マイケル
書籍に関しては、自分の把握している範囲だと下記で触れていました。
初めに触るとっかかりとしてよさそうだったので貼っておきます!
Unreal Engine 5 リアルタイム ビジュアライゼーション 第2版
マイケル
またグラフィックス周りの最適化については、下記書籍内で具体例をいくつか記載されていてとても参考になりました。
読んだことが無い方はこちらも見てみることをおすすめします!
背景アーティスト導きの書
各機能の概要
マイケル
まずはざっくり、それぞれの機能概要を表でまとめてみました。
メリットや注意点、従来機能との比較はそれぞれ下記のようになります。
Nanite、Lumen、VSMの機能概要
機能
〇 メリット
△ 注意点
Nanite
・仮想化ジオメトリストリーミングにより高精細なメッシュを描画する ・自動で最適な詳細度(LOD)描画を行う
・Opaque、Maskedマテリアル以外は非対応 ・Masked、WPO使用マテリアルはパフォーマンスが悪い ・スケルタルメッシュ描画は5.5で実験段階 ・シャドウマップ非対応(VSM推奨)
Lumen
・ベイク無しで動的なGIを実現する ・Naniteジオメトリと相性が良い
・処理負荷が比較的高い ・残像が起きやすい
Virtual Shadow Map (VSM)
・VirtualTextureの仕組みを活用することで質の高いシャドウ描画を行う ・Naniteジオメトリと相性が良い
・処理負荷が比較的高い
Nanite、Lumen、VSMの従来機能との対応
機能
従来の機能
〇 優位性
Nanite
・LOD
・高ポリゴンのメッシュを最適化して描画できる ・メッシュ個別のLOD作成が不要
Lumen
・Lightmapによる焼き付け ・Screen Space Global Illumination (SSGI) ・Path Tracer
・リアルタイムにGIが行える
Virtual Shadow Map (VSM)
・シャドウマップ ・レイトレーシングのシャドウ ・距離フィールドシャドウ ・Lightmassによる自動計算されたシャドウ
・Naniteジオメトリに対応し、高品質
エレキベア
従来の機能を置き換えるような形になるのクマね
これはグラフィックス周りにおいてかなり影響が大きい話クマ
マイケル
Naniteの概要
Naniteとは
マイケル
改めてになりますが、Naniteは 仮想化ジオメトリストリーミングにより高精細(高ポリゴン)のメッシュを効率的に描画する仕組み になります。
Lumen、VSMの処理にも大きな影響を与えるため、中核となる機能といっても過言ではないと思います。
エレキベア
マイケル
ざっくりいうと、メッシュを分割して構築した階層構造を用いて、リアルタイムに適した詳細度でポリゴンを描画する 処理になります。
数百万レベルの高ポリゴンメッシュをリアルタイムにLOD制御してくれる ようなイメージだね。
▲車のポリゴンメッシュを表した状態
▲遠ざかるとポリゴン数が削減されていることが確認できる
エレキベア
そんな夢のような機能があるのクマね・・・
それがあればどんな重いメッシュも使い放題というわけクマか
マイケル
とはいえNaniteにも苦手なメッシュや非対応のものもあるため注意が必要です。
簡潔にまとめると下記のようになります。
機能概要
機能
〇 メリット
△ 注意点
Nanite
・仮想化ジオメトリストリーミングにより高精細なメッシュを描画する ・自動で最適な詳細度(LOD)描画を行う
・Opaque、Maskedマテリアル以外は非対応 ・Masked、WPO使用マテリアルはパフォーマンスが悪い ・スケルタルメッシュ描画は5.5で実験段階
UEバージョンによる変遷
UEバージョン
変更点
5.0
・Naniteの登場
5.2
・Maskedマテリアル、WPOの対応
5.3
・Nanite Tessellation (実験的機能)追加
5.5
・SkeletalMeshへの対応(実験的機能)追加
エレキベア
Makedマテリアル、WPOを使用したマテリアルはパフォーマンスが悪いのクマね
確かにこれは注意が必要そうクマ
Naniteの処理内容
マイケル
Nanite及び仮想化ジオメトリがどのような処理になっているかというと、
メッシュをクラスタ単位に分割して階層構造を構築し、クラスタ単位で描画メッシュを切り替える ことでLODのような挙動を実現しているようです。
Nanite Visualizationから内容を確認することができ、CitySampleで区アスタとポリゴンを表示してみたものが下記になります。
▲CitySampleの例のシーン
▲Nanite Visualization > Clusters からクラスタを表示した状態
▲Nanite Visualization > Triangles から分割されたポリゴンを表示した状態
エレキベア
カメラを動かすと動的に切り替わるのが確認できるクマね
マイケル
処理自体は高度な内容になるため深くは触れませんが、下記動画で細かい内容を解説しているようなので興味ある方は見てみると面白いかもしれません。
参考: A Deep Dive into Nanite Virtualized Geometry | Youtube
エレキベア
マイケル
またProfilerで見た際にNanite処理がどこに当たるのかというと、主に下記4つが関係するようです。
▲ProfileGPUで見た状態、Naniteに関連する箇所は赤枠部分
処理
概要
VisBuffer
・見えるメッシュのみに絞り、詳細度を決定する
LumenSceneSceneUpdate
・LumenSceneの更新を行う
BasePass
・VisBufferで求めた情報を元にMaterialを描画する
ShadowDepths
・VSMの計算を行う
マイケル
実際に表示するメッシュを決定している部分はVisBufferの処理になっていて、Lumen、VSMにも影響していることが読み取れます。
この辺りは下記スライドで細かく解説いただいていました。
参考: Unreal InsightsとProfileGPUから見るLumenとNanite + 5.4までのアップデート
マイケル
そしてその他、細かい情報を取得するためのコマンドが用意されています。
必要に応じて駆使するとよさそうです。
NaniteのShading情報表示
r.ShaderPrint 1
r.Nanite.ShowStats 1
▲Shading情報の表示
追加のVisualize機能使用
r.Nanite.Visualize.Advanced 1
▲r.Nanite.Visualize.Advanced 1 に設定すると追加のVisualize機能が使用できる
ProfileGPUでシェーディング情報可視化
r.Nanite.ShowMeshDrawEvents 1
各シェーディングパスもPrifileGPUで確認可能になるはずだが、UE5.4だと上手く確認できず・・・
エレキベア
Naniteの設定方法
マイケル
Naniteの設定方法は簡単で、インポート時に「Build Nanite」を有効にするか
StaticMeshEditor上でも有効にすることが出来ます。
各種設定もここから行えますね!
▲StaticMeshEditorからのNaniteの設定
各項目の設定内容:
Nanite のフォールバック メッシュと精度の設定
マイケル
複数アセットを一括で設定することも出来て、その場合ContentBrowserから選択した状態で右クリック > Nanite項目から行えます。
▲ContentBrowserからも設定が行える
エレキベア
マイケル
また余談になりますが、ContentBrowserからは「NaniteEnabled」でフィルタをかけることでNanite有効・無効アセットを一括で検索することも出来ます。
▲ContentBrowser上から「NaniteEnabled」でフィルタをかけることができる(Column表示にすると分かりやすい)
エレキベア
Nanite対応アセット
マイケル
こんなに便利なら全てNaniteアセットにすればいいのでは・・・?と思いますがそうはいきません。
UE5.5の現状はNaniteに対応されていないアセットもいくつかあるため、注意が必要です
機能
〇 使用可能
△ 注意が必要
× 使用不可
ジオメトリ
・スタティックメッシュ
-
・スケルタルメッシュ(※5.5から実験的機能として使用可能)
マテリアル
・Opaqueマテリアル
・Maskedマテリアル ・WorldPositionOffset(WPO)使用マテリアル
・Opaque、Masked以外のマテリアル
参考: Naniteのサポートされている機能 | Unreal Engine 5.5 ドキュメンテーション
マイケル
そしてNaniteがサポートされるプラットフォームにも指定があるためこちらも注意が必要です。
もし非対応環境もサポートする場合には、手動のLOD設定も視野に入れなければならなそうです。
参考: サポートされるプラットフォーム | Unreal Engine 5.5 ドキュメンテーション
エレキベア
Nanite Tesselation (実験的機能)
マイケル
そして最後に紹介になりますが、UE5.3からは実験的機能として「Nanite Tesselation」 という機能も追加されたようです。
こちらはディスプレイスメントマップを適用したメッシュをNaniteジオメトリとして扱うことが出来る機能 になります。
▲Naniteテッセレーションを使用した例
引用:Nanite テッセレーション | Unreal Engine 5.5 ドキュメンテーション
▲マテリアルからディスプレイスメントマップを接続する
引用:Nanite テッセレーション | Unreal Engine 5.5 ドキュメンテーション
エレキベア
おお~~これが出来ればマテリアルでいろいろ操作して遊べそうクマね
マイケル
導入方法については下記の記事で書いてくださっていたので、興味がある方はこちらも触ってみてください
参考:
[UE5]Nanite Tessellation を使ってみよう
Lumenの概要
Lumenとは
マイケル
次にLumenは、ベイク無しで動的なGI(関節光、リフレクション)を実現する 機能になります。
▲Lumen無効
▲Lumen有効
エレキベア
リアルアイムにGIクマか・・・
そんなこと本当にできるのクマ?
マイケル
事前の焼き付けが必要だったこれまでと比べたらすごいよね。
事前にLumenSceneと呼ばれる照明情報を作成してからライティングすることで実現 していて、
処理負荷は比較的高いけど、Naniteメッシュと相性がよく効率的に構築することができる んだ。
機能概要
〇 メリット
△ 注意点
・ベイク無しで動的なGIを実現する ・Naniteジオメトリと相性が良い
・処理負荷が比較的高い ・残像が起きやすい
従来機能との対応
従来の機能
〇 優位性
・Lightmapによる焼き付け ・Screen Space Global Illumination (SSGI) ・Path Tracer
・リアルタイムにGIが行える
エレキベア
Lumenの処理内容
マイケル
Lumenの処理内容としては、LumenSceneという簡略化したシーンを構築してトレースすることで描画 します。
ざっくりと下記のような流れになっています。
LumenSceneの構築
各メッシュのカードを生成して照明計算を行う
計算結果を元にメッシュorディスタンスフィールドを表示する
LumenSceneのトレース
下記いずれかの方法でトレースを行う
Software RayTracing (ディスタンスフィールド)
Hardware RayTracing (メッシュ)
マイケル
LumenSceneは、Visualizationから表示できます。
SurfaceCacheを表示すると、計算できる部分などの表示も確認することが出来ます。
▲LumenSceneの表示
▲SurfaceCacheの表示(マゼンタ: 計算できない部分 黄色: SurfaceCacheに入っていないもの)
エレキベア
事前に必要な情報を計算してからトレースを行うクマね
マイケル
細かい内容については下記スライドで紹介されていたのでご参照ください!
こちらでは シーン全体のDeferred Rendering と例えられていて確かにと思いました。
参考: Unreal Engine5 Lumenの仕組みと肝心なところ
Lumenの設定方法
マイケル
Lumenは Project Settings > Rendering から有効にできます。
それに加えて GIのスケーラビリティ設定を High以上に設定 するとゲーム内で有効になります。
▲Project Settings > Rendering から設定を行う
参考:
Lumen の設定 | Unreal Engine 5.5 ドキュメンテーション
Lumen パフォーマンス ガイド - スケーラビリティ設定 | Unreal Engine 5.5 ドキュメンテーション
エレキベア
ここでGIをどのように表現するかを設定できるのクマね
マイケル
プロジェクト設定は全体に設定されるけど、CineCameraやPostProcessでも設定出来るので
細かい調整が必要な場合にはこれらを使用しましょう。
マイケル
トレース方法としては Hardware RayTracingを使用すると綺麗に反射が表現できますが、対応機種は限定されるため注意が必要 です。
こちらの挙動を確認したい場合、Project Settingsから「Support Hardware ray Tracing」「Use Hardware Ray Tracing When available」を無効にすることで、明示的に設定することができます。
トレース方法の種類
Software RayTracing
Hardware RayTracing
対応条件参考:
ハードウェア レイ トレーシング | Unreal Engine 5.5 ドキュメンテーション
最適化の方法
マイケル
最後にLumenをどう最適化、調整すべきかについてですが
基本はスケーラビリティを変更することで大まかに変更 しつつ、
それに加えてNaniteの設定を調整したり、Lumen解像度など細かい調整を行うことで最適化していくのがよいそうです。
基本はスケーラビリティの設定
Epic: 30fps向け、High: 60fps向け
アセット側の対応
StaticMeshを出来るだけNanite化
Naniteの軽量化
Lumenカードをマージ
Lumenカードの解像度を下げる
Lumen計算の複数フレーム分散
参考:
Unreal InsightsとProfileGPUから見るLumenとNanite + 5.4までのアップデート
Lumen パフォーマンス ガイド | Unreal Engine 5.5 ドキュメンテーション
マイケル
Nanite設定がLumenのパフォーマンスに影響を与えることを考えると、ポリゴン数が少ないメッシュでもNanite化しておくことは意味がありそうですね
エレキベア
UE5以降のグラフィック最適化は、Naniteが主軸となりそうクマね
Virtual Shadow Map (VSM)の概要
VSMとは
マイケル
最後にNanite、Lumenと一緒に出てくることの多いVSMについてですが、こちらは Virtual Shadow Map の略になります。
名前の通りVirtualTextureの仕組みを活用したShadowMap で、タイル状に並べた高解像度のShadowMapを使用することで、高品質なシャドウ描画を行うことが出来ます。
参考:
仮想シャドウマップ | Unreal Engine 5.5 ドキュメンテーション
機能概要
〇 メリット
△ 注意点
・VirtualTextureの仕組みを活用することで質の高いシャドウ描画を行う ・Naniteジオメトリと相性が良い
・処理負荷が比較的高い
従来機能との対応
従来の機能
〇 優位性
・シャドウマップ ・レイトレーシングのシャドウ ・距離フィールドシャドウ ・Lightmassによる自動計算されたシャドウ
・Naniteジオメトリに対応し、高品質
▲従来のShadowMap
▲VirtualShadowMap
▲タイル状に並べたShadowMapを使用する
エレキベア
むむ、これもNaniteと相性がよい機能なのクマね
VSMの処理内容
マイケル
VSMの処理内容としては、ざっくりと下記のようになります。
ShadowMapの作成
VirtualTextureを使用し、必要な場所に必要な解像度で作成する
ShadowMapの描画
Shadow Map Ray Tracing(SMRT)によりシャドウ描画を行う
マイケル
ShadowMapは、VirtualTextureを使用して画面に移った範囲に応じて必要な解像度で作 成し、VirtualPageを表示することで確認できます。
この作成処理はNaniteメッシュを使用すると効率よく作成できるようです。
▲タイル状に並べたShadowMap
▲画面に映った範囲に応じて必要な解像度で描画する
エレキベア
必要な箇所ほど高解像度で描画されるというわけクマね
VSMの設定方法
マイケル
VSMの有効化に関しては、Project Settings > Rendering から切り替えることができます。
エレキベア
Lumenと同じくプロジェクトの設定として設定できるクマね
マイケル
その他、細かい設定については r.Shadow.Virtual.XXX 形式のコンソールコマンドがいくつか用意されているようなので、こちらから調整しましょう。
最適化の方法
マイケル
最適化の方法としては下記のような方法があります。
この中でキャッシュの確認については CachePageの表示で確認 することが出来るため、まずは無効になっているオブジェクトが無いか確認してみましょう。
キャッシュを無効化するオブジェクトを減らす
Distant Lights、Onepass Projectionを有効にする
LodBiasでShadowMapのLODを調整する
Max Physical Pagesを減らす
参考:
仮想シャドウマップ - キャッシュ | Unreal Engine 5.5 ドキュメンテーション
▲CachePageを表示すると、現在のCache状態が確認できる
▲r.shadow.virtual.showstats 1 でVSMの状態を確認することも出来る
エレキベア
おわりに
マイケル
というわけでUE5のグラフィックス機能についてでした!
どうだったかな?
エレキベア
UEのグラフィックス機能がすごいのは知っていたクマが、改めて見るとメッシュ、ライティング、シャドウイングと常識を大きく覆す機能だったクマね
特にNaniteはそれぞれに影響を与えていて肝になると思ったクマ
マイケル
Naniteの影響が大きいから、最適化もこれまでのやり方とは大きく異なってくるね
素晴らしい機能とはいえ、現状だとまだ未サポートのメッシュもあったりするから、それらとこのグラフィックス機能のバランスを取って調整するスキルが必要そうだ!
マイケル
どちらにせよUEを触る以上は付き合っていかないといけない部分だから、メリット・デメリットを理解してガンガン活用していこう!
それでは今日はこの辺で!アデューー!!
エレキベア
【UE5.5】Nanite、Lumen、VSMの概要についてまとめる ~完~