UE4.24時代のimposter製作方法
まえがき
おそらくの話ですが、昔の頭良い人は考えました。
「遠景オブジェクトはどうせ見える角度が変わらないんだから、板ポリで表現すれば良いじゃん。」
そんなわけで、以下のように負荷軽減策として使われるようになりました。
以上、Epic Zen Gardenの紹介でした。
めでたしめでたし。
Imposterとは
日本語に直訳すると「詐欺師」らしいですが、UE4では遠景オブジェクトを表現する手法の一つとして存在しています。
「まえがき」では、見える角度が変わらないオブジェクトに対して板ポリで表現するということを紹介しましたが、UE4のImposterは一味違います。カメラの位置に対して、パラパラ漫画のように板ポリに表示する画像を変えることで、ポリゴン数を抑えつつもどのような向きにも対応できるオブジェクトが表現できます。つまり、こう↓
Imposter pic.twitter.com/lTqolmemtu
— croMisaP (@croMisa) May 9, 2020
向きが断続的なことと、真上真下は若干怪しい感じでしたが、遠景だったり大量に出ている等の負荷削減のための場所に適用すれば気付かれにくいでしょう。
本家本元であるEpicGamesはFortnite内で、遠景の木などにしようしてるらしいですね。
Imposterの作り方
基本的には先程貼った
3D Imposter スプライトをレンダリングする | Unreal Engine Documentation
や、ヒストリアさんの
[UE4] Imposterを使ってみる(多視点対応のビルボード)|株式会社ヒストリア
を参考にすれば大丈夫です。
しかし、とある一点について注意が必要で、UE4.24では上手くいきません。
DecalMaskが無い問題
どちらの手順でも、CaptureするG Bufferの選択でDecal Mask
を選択しています。
これは当たり前の話で、板ポリにテクスチャを貼るので余白をMaskするために出力します。
しかし、出力できません。他のものは出力されますが、DecalMaskは出力されません。
なんでだろうと思い、探しましたらありました。
どうやら2017年の2月末のバージョンのではもう、DecalMaskは無いようです。
出力できないからSceneDepthを使ってねとあります。
んじゃ使うか~と思いきや、SceneDepthもありません。
答え
おまじないコマンドke * rendertextures
を、
r.BufferVisualizationOverviewTargets BaseColor,SceneDepth
とHighResShot N
(Nは高精細スクショの倍数)にしましょう。
解説
おまじないコマンドke * rendertextures
を簡単に見ていきます。
ke
というのはKismetEvent
の略称でBlueprintのイベントを呼び出すコンソールコマンドです。
どのBlueprintに対してかを次に入力するのですが、*
とすることで全てのBlueprintに対して送ります。
その次がBlueprintのイベント名でrendertextures
というイベントを呼び出します。
参考
[UE4] コンソールコマンドの使い方&よく使うコマンド一覧|株式会社ヒストリア
rendertextures
イベントを持つのは、GameModeに定められているRenderToTexture_Pawn
です。
Event Graphを見ると、rendertextures
イベントは以下の2つを実行しているだけだと分かります。
この
Generator
というのは、Levelに配置して設定を行うRenderToTexture_LevelBP
のことです。
BufferCommand
r.BufferVisualizationOverviewTargets BaseColor,SceneDepth
側ですね。
RenderToTexture_LevelBP
のSetBufferCommand
関数を見ると、チェックを付けると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ってもうリリースされちゃったの?!?!?!?!