【UE5】高ポリゴンのアセットを置きすぎて動かなくなった日本庭園プロジェクトをNaniteが解決してくれるか
Unreal Engine 5の新機能Nanite。超ハイポリゴンメッシュに魔法をかけることであら不思議サクサク動いてしまうという素晴らしい機能なわけですが、FPSを割と無視して作ってしまう建築ビジュアライゼーションのプロジェクトは当然まともに動かないわけです。でもいいんですよ成果物はシーケンサとかMovie Render Queueで作るから。リアルタイムで動かなくていいんです。
でもNaniteとか聞いちゃうと、もしかしたらアセットを根こそぎNanite有効化するだけでフレームレートを劇的に改善してくれちゃうのではないか? と期待してしまいますよね。ということで実際にNanite変換をしてみたいと思います。
使うプロジェクトは、2年前くらいに作った日本庭園です。
動画版
今でこそ40FPSくらいで動いてくれていますが、最初は5FPS出てませんでした。2、3FPSとか。
それもそのはずアセットはV-RayやCorona向けのデータなのです、リアルタイムレンダリングにそのまま入れちゃだめなやつです。
当時は対策として、元のメッシュを間引いてポリゴン数を50~75%にしました。さらにLODを作成してフレームレートを確保。当時はグラボがGTX1060だったので20FPSでしたが、今はRTX2060なので40FPS弱が出ている――という流れになっていると思われます。
それでは、ここからNaniteを使うと60fps超えをしてくれるのか!? そんな都合のいい結末があるのか試してみたいと思います。
やってみよう
樹木のアセットは大半が3dsky.orgで、あとの2、3種類はUE4の無料プロジェクトのアセットです。
検証設定:アセット
Nanite有効の対象とするアセットは以下の7種類にしました。
どれも数十万Trianglesで、しかも数十本置いているので負荷は相当です。ポリゴン数で言えば合計で数千万Trianglesになっているシーンのはず。
Assets | Triangles | Preview |
---|---|---|
かえで1 | 530,000 | |
かえで2 | 210,000 | |
植栽1 | 150,000 | |
植栽2 | 210,000 | |
植栽3 | 70,000 | |
笹の葉 | 130,000 | |
ニレの木 | 180,000 |
検証設定:画角
パフォーマンス測定に使うカメラアングルはこの3つにしました。
Camera Actor | Preview |
---|---|
CineCameraActor57 | |
CineCameraActor58 | |
CineCameraActor59 |
検証設定:現状のパフォーマンス
いま時点のTriangles数ですが4,000万Tris超えてました、そりゃあかんわ。
●LOD有り 3082万ポリゴン 約35FPS
1.元々の高ポリゴンメッシュのアセットを普通にUE5にインポート
間引き前のオリジナルデータをUE5にインポートします。
インポートのオプション画面で[Build Nanite]チェックをONにします。
公式を見ると[Generate Lightmap UVs]をOFFにすることでNanite処理が短く済むとの記載があります。
メッシュが多いので時間が凄いかかる。1アセット3、4分くらいかかる・・・はずなんですが、10秒くらいで終わりました。あれ?
あと、見つけやすいようにネーミングルールを決めまして、アセット名の末尾に「_nanite」と付けておきます。
2.アセットがNanite有効になっているか確認
コンテンツブラウザからアセットを探してダブルクリック。Naniteは効いているみたいです。表示上は全体的に2000~3000Trisのようです。
いくつかでバグってます。というかアーリーアクセスだからバグなのか即断しにくいけど、事実として起こった現象です。
・マテリアルが一切効かない。ずっとチェッカーになる。
・特定のマテリアルを適用すると全メッシュがグレーの表現になる。
・葉っぱが消える。
3.アセットをNanite版に置き換える
今回はバグは放っておいてこのまま進めます。ワールド中に配置された対象の全アセットをNanite版に置き換えてみましょう。
ドキュメントとかチュートリアル動画を読む限りはこれで以上らしいです。本当にこれだけでいいんですかね。
検証
それでは実際にPlayしてみましょう。
なのですが・・・あれ? 体感では全然変わらない。LOD版と比べてもポリゴン数は1割減ったみたいですし、40FPS超えたー!みたいな結果になってもよさそうなんですけど。
●測定結果
Assets | FPS | Triangles |
---|---|---|
元の状態 | 10 | 41,820,000 |
LOD対応版 | 35 | 30,820,000 |
Nanite有効版 | 30 | 27,910,000 |
速度面のパフォーマンスは全くない。シェーダーの影響だからあとはマテリアル直せってことですか?
というより樹木以外のアセットをどうにかするべきだったか?
アーリーアクセスに対してケチをつけるだけってのは野暮ですから現状の対応状況の再確認が必要でしょう。
考察
ところでなぜパフォーマンス改善がなかったんでしょうね。
公式サイトを改めて読んでみると、実は色々と制約があります。(そりゃそうだ)
メッシュ、アセットのデータ構成、マテリアルの観点で見直してみます。
メッシュ
1つ目はRigid meshに限定するという点。直訳すると「剛体」ですが、つまりは「変形しないメッシュ」のことです。具体例を挙げてくれていて、
・スケルタルアニメーションやモーフターゲットは非対応
・他にもテセレーションやディスプレースメントも非対応
今回私はRigid Meshを使用していませんでしたから問題ありませんでした。
Naniteが得意な形状
このあたりからジオメトリやポリゴンの在り方について書かれていますが、ここで葉っぱ類が上手く行かない理由がわかります。
連続した密集した三角形は得意だが、バラけたり密でない三角形は苦手だということ。
得意 | 苦手 |
今回私が使用した樹木アセットは「葉まで形状を起こしている」と言いましたがこれが該当します。幹や枝は密集した連続のポリゴンですが、葉は2~4ポリゴンで非連続です。
苦手なデータの対処方法
続けて次のような補足もしてくれています。「樹木はこの問題の最たるケースですが・・・」と説明が続きますが、Epicさんはやっぱり動作確認はしてくれいたことが伺えます。さすが。
現時点ではアセットを①葉と②幹に分けて、②幹だけにNaniteを適用すると上手くいく可能性があると。優しい。
今回このセパレートタイプの樹木は検証のレベルに配置していなかったのでNanite有効にはしませんでしたが、この樹木だけ置きまくって再実験したら顕著な改善結果が得られたのかもしれません。
データの持ち方
細かい話になりますが、3Dデータの持ち方にも言及しています。頂点と三角形のデータ比率は2:1以上が望ましいとのこと。
Columnみたいな補足情報
図形フォーマットの構造がわからない方向けに説明します。
例えば以下のような三角形3枚から成る扇形の3D図形があるとした時、頂点(Vertex)と三角形が配列の何番目で作られているか(Index)がずらーっと書かれています。
もしかしてあなたはこうすればいいじゃんと想像したかもしれません。
これでは無駄が多いんです。無駄が多いということは、ファイルサイズが大きくなってしまいます。またデータの更新も大変です、例えば頂点Oが変更されたら3か所のデータ更新が必要だったり色々管理しにくい。
データ比率3:1 データサイズ144Byte
そこで、賢い先人の方が頂点の重複を避ければいいじゃんと考えて、以下のようにデータを格納しました。
データ比率1.6:1 データサイズ96Byte
一工夫するだけで情報量が1/3くらい削減できます。つまりファイルサイズも1/3近く減らせます。
話を戻すと、前者の3:1のデータ構成だと、Naniteが上手く処理できない可能性があると言っています。
後者のような共有された頂点が多いほど効率化できるとのこと。
マテリアル
最後にマテリアルの制約です。
・オペーク(不透明)以外のあらゆるブレンドモードは非対応
・マスクやトランスルーセントも含む
なに! 樹木関連は全滅だって言ってるようなもんです。加えて、
・両面(Two Sided)やオフセット関連も非対応
とのことです。裏を返せば、なぜNaniteのデモプロジェクトに古代の谷のような乾燥帯のシーンが採用されたかが理解できますね。現時点でNaniteにとって緑にあふれた大自然のシーンは天敵だと。
そういえば私の使用した樹木のいくつかが真っ白になったりしましたが、MaskやOffsetを使ったマテリアルだったからレンダリングできなかったのだとわかります。試しにOpaqueのマテリアルを適用したら正しく表示されました。
さいごに
うーん。建築ビジュアライゼーションにおいて高ポリゴンなアセットってダントツで自動車と樹木ですので、この2つに高確率で機能してくれないと残念ながら難しい。しばらくは従来通りLODで凌ぐしかないのでしょうね。
次はあからさまに効果があるとわかっているメッシュが多く使われていて、フレームレートが低いプロジェクトを選出して出直すとします。
今更だけど、これってもしかして[ハードウェアレイトレーシング]をOFFにして、ラスタライズで比較させないと意味なかったりする?
まあアーリーアクセスですし、Epicさんなら早急に対応してくれるでしょう。
参考サイト
・Nanite Virtualized Geometry – Unreal Engine 5 Docs
・3D Bamboo Treeby Indaneey_design – Turbosquid
・Bush 02 – 3dsky
・The bush 001 – 3dsky
・Japanese maple tree – 3dsky
・Cannabisfree – 3dsky
・Archinteriors for UE vol.1 – EVERMOTION