UE4.24時代のimposter製作方法

まえがき

おそらくの話ですが、昔の頭良い人は考えました。
「遠景オブジェクトはどうせ見える角度が変わらないんだから、板ポリで表現すれば良いじゃん。」
そんなわけで、以下のように負荷軽減策として使われるようになりました。
f:id:crssnky:20200509220833p:plain

左側のメイン部分のより奥にある、宙に浮く岩

f:id:crssnky:20200509220850p:plain

こんな感じで板ポリで表現されています。

以上、Epic Zen Gardenの紹介でした。
めでたしめでたし。

Imposterとは

日本語に直訳すると「詐欺師」らしいですが、UE4では遠景オブジェクトを表現する手法の一つとして存在しています。

docs.unrealengine.com

「まえがき」では、見える角度が変わらないオブジェクトに対して板ポリで表現するということを紹介しましたが、UE4のImposterは一味違います。カメラの位置に対して、パラパラ漫画のように板ポリに表示する画像を変えることで、ポリゴン数を抑えつつもどのような向きにも対応できるオブジェクトが表現できます。つまり、こう↓

向きが断続的なことと、真上真下は若干怪しい感じでしたが、遠景だったり大量に出ている等の負荷削減のための場所に適用すれば気付かれにくいでしょう。
本家本元であるEpicGamesはFortnite内で、遠景の木などにしようしてるらしいですね。

Imposterの作り方

基本的には先程貼った

3D Imposter スプライトをレンダリングする | Unreal Engine Documentation

や、ヒストリアさんの

[UE4] Imposterを使ってみる(多視点対応のビルボード)|株式会社ヒストリア

を参考にすれば大丈夫です。
しかし、とある一点について注意が必要で、UE4.24では上手くいきません。

DecalMaskが無い問題

どちらの手順でも、CaptureするG Bufferの選択でDecal Maskを選択しています。
これは当たり前の話で、板ポリにテクスチャを貼るので余白をMaskするために出力します。 しかし、出力できません。他のものは出力されますが、DecalMaskは出力されません。

forums.unrealengine.com

なんでだろうと思い、探しましたらありました。
どうやら2017年の2月末のバージョンのではもう、DecalMaskは無いようです。
出力できないからSceneDepthを使ってねとあります。

んじゃ使うか~と思いきや、SceneDepthもありません。 f:id:crssnky:20200509225712p:plain

Scene Depth World Unitsはあるが、目的のものでは無い

答え

おまじないコマンドke * rendertexturesを、
r.BufferVisualizationOverviewTargets BaseColor,SceneDepthHighResShot N(Nは高精細スクショの倍数)にしましょう。

解説

おまじないコマンドke * rendertexturesを簡単に見ていきます。
keというのはKismetEventの略称でBlueprintのイベントを呼び出すコンソールコマンドです。
どのBlueprintに対してかを次に入力するのですが、*とすることで全てのBlueprintに対して送ります。 その次がBlueprintのイベント名でrendertexturesというイベントを呼び出します。
参考
[UE4] コンソールコマンドの使い方&よく使うコマンド一覧|株式会社ヒストリア

rendertexturesイベントを持つのは、GameModeに定められているRenderToTexture_Pawnです。
Event Graphを見ると、rendertexturesイベントは以下の2つを実行しているだけだと分かります。 f:id:crssnky:20200509231842p:plain このGeneratorというのは、Levelに配置して設定を行うRenderToTexture_LevelBPのことです。

BufferCommand

r.BufferVisualizationOverviewTargets BaseColor,SceneDepth側ですね。
RenderToTexture_LevelBPSetBufferCommand関数を見ると、チェックを付けるとr.BufferVisualizationOverviewTargetsの後ろにG Bufferを追加していく様子が分かります。そして、この追加される文字列にはSceneDepthが無いことも分かります。
つまり後ろに撮りたいG Bufferを繋げれば良いので、r.BufferVisualizationOverviewTargets BaseColor,SceneDepthとなります。
Normalも欲しければr.BufferVisualizationOverviewTargets BaseColor,SceneDepth, WorldNormalとなるでしょう。

ShotCommand

HighResShot N側です。同じくSetBufferCommand関数にあります。
なんやかんやで数値を決めていますが、つまり自分の欲しい解像度の倍数を入れれば良いです。
参考
Taking Screenshots | Unreal Engine Documentation

おわりに

自動化されている部分がバージョンアップに追いついていないので、手作業でやる方法を示しました。
EngineContentを変えちゃっても良いかな。っていう人は、DecalMaskをチェックしたときにSceneDepthが追加されるようにすれば良いのではないでしょうか。
まぁこれで、ようやくUE4.24でもImposterが書き出せるということで。

え?!UE4.25ってもうリリースされちゃったの?!?!?!?!