BLOGブログ

2020.05.18UE4

[UE4]Megascansで映像制作・シーンを最適化してみる(初心者向け)

執筆バージョン: Unreal Engine 4.24

Megascansで映像制作の関連記事はこちらです。
Megascansについて https://historia.co.jp/archives/13752/
映像を盛ってみる https://historia.co.jp/archives/14197/

前回の記事ではシーンを作成しました。しかしそのままだと処理負荷が高いので、今回は簡単にですが最適化します。

今回の記事では特定のコンソールに向けてではなくエディタ上で見ているだけのため、かなり簡易的なものになります。
本来はターゲットのハードウェアや出したいフレームレート(ms)、ゲームの処理を除いた描画部分でそれぞれどれくらいのmsまで許されているのか、ボトルネックになっている部分など、仕様や状況に合わせての最適化が必要になってきます。
本記事では簡単なVisualizerの見方と、負荷が高いライトとFogの項目だけ対応することにしています。映像でUE4を触っている人がゲーム用シーンなど、処理負荷を気にするシーンを作るときの手がかりとなれば幸いです。

UE4のヘルプでも最適化のガイドラインが書かれているのでご参照ください。
https://docs.unrealengine.com/ja/Engine/Performance/Guidelines/index.html

目次
・GPU Visualizerを開く
・UE4のライト軽量化の手法について
・Volumetric Fogのライトビルド時の対応
・Volumetric Fogの代替表現について

 

・GPU Visualizerを開く

それではシーンを見ていきます。

ひとまず、プロファイルを取ってみます。UE4のGPU Visualizerでどの部分が一番負荷がかかっているのか見てみます。

ctrl+shift+,のショートカットを押すとGPU Visualizerのウィンドウが出てきてショートカットキーを押した瞬間のフレームの処理負荷を出力してくれます。瞬間的な負荷処理をみているので、いくつかのカットや同じ場所で比較する際にも何度かキャプチャして、一時的な処理負荷がかかっているのではないことを確認します。するとだいたいのカット(場所)でも一番処理負荷がかかっているのが、ShadowDepth(Directional Lightのもの)、次にVolumetric fog、以下はBasepassもしくはPostProcessとなっています。


今回はShadowDepthとVolumetric Fogについて主に見ていきますが、本来は前述の様に、何msにするのかという目標を決めて負荷がかかっている原因と、それにあった解決方法を取るかと思います。

いくつか上記のパラメータを簡単に紹介したいと思います。

PrePass 深度情報を計算します。メッシュの前後関係を予め計算しておくことで、余計な計算をしないための工程です。ポリゴン数が多いと負荷がかかります。
BasePass ビューポートのView Mode>Buffer Visualization>Overviewから表示できるものを計算している工程です。ここの項目の負荷原因には、ポリゴン数、マテリアルの複雑さ、テクスチャの解像度などの複数の要素が関わってきます。すべての項目に関することですがカリングをしっかりして画面外のものを描画しないことも大事です。
ShadowDepth 動的に生成される影(Movaleなライトからの影、Statinalyの動的メッシュに対する影など)の項目です。
Volumetric Fog Volumetric Fog効果による負荷です。Fogそのものの負荷はExponential Height FogもしくはAtomoshpereの項目にあります。
Light ライトの計算に関する項目です。ライトの個数よりも、ライトの影響範囲が重なると重くなっていきます。ライトの計算をするかどうかはライトの影響範囲(Attenuation Radius)で決まるため、光が減衰しきっているのにライトの影響範囲が広すぎると無駄に計算させてしまうことになります。
PostProcessing ポストプロセスによる負荷です。ポストプロセスの項目や設定によって負荷が異なるため、ポストプロセス内の何の効果が重いのか特定しましょう。
Translucency 半透明で描画しなければいけないもの、例えばエフェクトなどがたくさんあると負荷が増えていきます。半透明は重なっている部分は重なっている分だけ同じピクセルが複数回計算されます。

 

・UE4のライト軽量化の手法について

現在このシーンはすべて動的ライティングがなされ、ライトビルドなどを使用せず、負荷を考慮していないシーンになっています。

ライトを常に計算させる(Movableなライト)のは処理が重くなってしまいます。
そのため、UE4ではLightmassという機能をつかってライティングを事前に計算して軽くする手法があります。LightBuildを行うことでLightmass機能を使ってLightmap、Shadowmap、Precomputed Light Volumeが生成されます。
LightmapとShadowmapはStaticなメッシュに対して生成され、Precomputed Light Volumeは空間中のライティング情報を持っていて、Movableなメッシュをライティングすることができます。
ちなみに、Volumetric FogはUE4.18からの入った方法のVolumetric Lightmapによって事前計算されたライティングをVolumetric Fogに反映することができています。

(通常のLightmass設定であればVolumetric Lightmapになっていますが、設定で以前の手法Indirect Lighting Cacheにすることができます。Volumetric LightmapとIndirect Lighting Chcheの比較はこちらのページの下段に記載されています。
https://docs.unrealengine.com/ja/Engine/Rendering/LightingAndShadows/VolumetricLightmaps/index.html

このシーンはほとんど動的ライトで照らされているため、ShadowDepthの処理負荷がメインとなっています。
Shadow Depthとは動的に生成されている影のことを指しています。
一度Directional LightをStatinaly(ライトのVolumetric Fog効果がStatinalyもしくはMovaleでないと現れないため)、その他のライトをStaticに変更します。(今回のシーンでは動的なオブジェクトが無い=動的な影を生成する必要が無いため、すべてStaticにしています。動的なオブジェクトがある場合、ライトによる落ち影はStastionaly、もしくはMovableでないと出ないので注意してください)

 

・Volumetric Fogのライトビルド時の対応

Volumetric Fogをそのまま使いたい場合はVolumetric Lightmapを生成しましょう。Volumetric Lightmapが正しく生成されているかはビューポートのShow > Visualize > Volumetric Lightmapで確認することができます。
空間中に球体が表示されればその空間中にPLV(Precomputed Light Volume)が作成されていることを示しています。

Volumetric Lightmapの密度を変更するにはWorldSettings>Lightmass>Volumetric Lightmap Detail Cell Sizeをから変更できます。
イテレーションのためにビルド時間を短くしたいときや、デフォルト値だと密度が高すぎる場合は値を上げましょう。
Volumetric Lightmapは何もしないとUE4側で自動でメッシュ付近に生成されますが、望んだ場所に生成されない場合もあります。その場合は
Lightmass Importance Volumeを置くと生成されます。

Volumetric Fogをライトビルドに対応するにはいくつか注意する点があります。
まずはVolumetric Fogの効果はStaticなライトには出ません。
そのため、Volumetric Fogの効果を持たせたいライトを事前計算したい場合はStatinalyになります。ライトビルドしたらVolumetric Fogの効果が消えてしまった!という場合はライトのMobilityがStaticになっていないか確認してみましょう。

他にもVolumetric Fogの効果が消えてしまう、もしくは見た目がライトビルド前と異なってしまうことがあります。
その原因はShadow Resolution Scaleの値が足りていないためです。下の画像はライトビルド前とライトビルド後の比較です。Shadow Resolution Scaleがデフォルトのままの状態です。
 
隙間から入ってくる光の筋が隙間の形状と合っていません。また天井などにも効果が滲んでしまっています。
Shadow Resolution Scaleを上げてみると、以下の画像の様になります。

ライトビルド前と全く同じ、というわけではありませんが、大きく形状が崩れている状態は改善できています。
ただし、Statinaly LightのShadowmap Resolutionを上げるということは、Movable、もしくはStatinalyなメッシュの動的な影に使用されるテクスチャの解像度を上げているので、その分の負荷は上がってしまいます。
例としてMovableに設定したボックスをたくさん置いて、Shadowmap Resolutionが1のときと、5のときをGPU Visualizerでキャプチャして比較してみます。
 
処理速度が約0.23ms増えています。
Shadowmap Resolutionを上げていくと影の解像度が上がったことで、1つのメッシュの影に対して使用するピクセルが増えることにより、Shadow mapのテクスチャ枚数が増える場合もあります。

また名前からのイメージで関連がありそうですが、Volumetric LightmapのCell Sizeを細かくしてもVolumetric Fogに対しての影響は有りません。
 
ライトビルドを行うと以下のような見た目になります。動的なライティングと静的なライティングは仕組みが異なるため、見た目が変わってしまうことがあります。それぞれのライトの強度や、ポストプロセスでのGIなどで調整しましょう。

ライトビルド後にもう一度GPU Visualizerでキャプチャしてみます。
MovableなライトをDirectional Lightを除いてStaticにして事前計算にすると、シーン中にMovaleなメッシュも無いため動的に生成される影がほとんどなくなり、以下のようにShadowDepthの処理負荷がほぼなくなったことがわかります。

 

 

・Volumetric Fogの代替表現について

では次にVolumetric Fogの項目の処理負荷を軽減してみます。

ただ、ライトに対するLightBuildとは異なり、Volumetric Fogそのものを事前処理させたりして軽くする手段はないため、別の方法で表現することにします。今回はゴッドレイ表現をメッシュに置き換えることで、処理負荷を軽減することを目指します。ExponentialHeightFogはそのままVolumetric Fogのオプションは外して通常のFogとして利用します。

以下のようなゴッドレイ表現用のマテリアルとメッシュを用意し、Volumetric Fogの代わりに配置して見ます。
 


再びGPUVisualizerでキャプチャしてみます。
Volumetric Fogの負荷がなくなり、またゴッドレイの変わりのメッシュは透過マテリアルを使用していますが、Translucencyの項目の処理負荷として特に目立った数値の上昇もなさそうです。
 

これで代替表現を用いることで、見た目を損なうことなくVolumetric Fogの処理負荷を無くすことができました。

最適化の際にはひとまずどの部分が重いのか確認し、重いものを最適化する機能がUE4に用意されているのか、もしくは代替的なものを使うのか検討して見てください。

簡単にですが、初めての最適化の足がかりになれば幸いです。