UE5 で Render Target と SceneCapture(Component)2D で背景透過でメッシュをキャプチャする

UE5ぷちコンに出したゲームの中で利用したので忘れないようにメモです。

ゲーム内では以下のキャラクター選択と、罠選択で利用しています。

キャラクター選択 罠選択

SceneCapture2D と Hidden Actors を使う

[UE4]アルファ付きキャプチャー画像の簡単作成|株式会社ヒストリア

上記で紹介されている方法です。

記事では Level に直接 SceneCapture2D を配置していますが、BP を作成して SceneCaptureComponent2D を利用することもできます。今回の私の用途のように最初から撮影する対象が固定されている場合はこの方が便利でした。(他にも方法がありそうな気がしますが、、、)

ただ、この場合は Hidden Actors の設定は Level に配置した状態でしかできないので注意です。(ThirdPerson テンプレートのデフォルトマップだと SM_SkySphere を抜いておけば大丈夫です)

Texture を作成し Material にする

記事どおりではありますが以下のようにしていきます。今回は Widget に表示するので Material もその設定にします。

Render Target を Material にする

キャプチャするメッシュに動きやエフェクトを発生させたまま UI に表示したい場合は、Render Target をそのまま Material に利用できます。

ノードは同じですが、 Texture Sample の Texture の設定だけを Render Target に変更します。

UI に表示

ImageWidget コンポーネントの Brush に作成した Material を配置します。スクリーンショットだと分かりにくいのですが、Render Target を指定した方は動いたままで表示されています。

私は経験が浅いので、上記の方法で多くの場合は問題なさそうに思います。以降は調べていた中で気になった方法です。

SkySphere の外側に持っていっても同じことにはなる

SkySphere の外側に配置し、かつ向きを SkySphere から反対にむければそれだけで Hidden Actors なしで透過した状態になります。

グリーンバックを使う

上記で作成した BP にカメラと撮影対象の周りを囲むように壁を隙間なく配置します。今回使用したマテリアルは Green 単色ですが、撮影対象の色に応じて調整してもいいと思います。

Render Target の指定も特に変更はありませんが、今回は Hidden Actors で背景を抜いていないので Material 側で工夫が必要になります。

Distance でグリーンバックとの色の距離を判定し近ければ透過させるという方法です。なので、メッシュに同色が含まれていると一緒に消えてしまいます。

スクリーンショットDetails に映しているように、if 式で判定条件を調整し、できるだけキレイに抜けるようにする手間もあります。

ただ、この方法だと Level に配置するだけで完結するので Hidden Actors を指定する必要がありません。

Post Process と Depth を使う

最後に Post Process と Depth を使う方法です。以下の動画を見て、深度で抜いた方が楽そうだなと思いました。

How to Create Masks With the Custom Depth Buffer | Tips & Tricks | Unreal Engine - YouTube

SceneCapture2D には Post Process Material を指定できるのでそれを利用します。

Blend Mode は不透明 (Opaque) である必要があるのと、Output Alpha が必要なところがポイントです。

Post Process Materials in Unreal Engine | Unreal Engine 5.0 Documentation

Outputting alpha is not yet supported (should go through Opacity).

上記ドキュメントから Alpha は Opacity を通すとなっているため、SceneDepth の結果は Opacity に流します。(そもそも Output Alpha を ON にしないと opacity は有効にならない)
これで深さに応じて透過します。

もう一つポイントは、SceneCapture(Component)2DCapture Source の設定です。

Final Color にしないと、Post Process が適用された状態のキャプチャが取得できないためここを変更します。

SceneCapture(Component)2D の Post Process Materials に作成した Material を指定すれば完了です。

最初の Hidden Actors を指定したのと同様にキャラクターだけがマスクされた Rendar Target の結果が得られると思います。
よって、このケースでは Hidden Actors の時と同じく反転した Alpha で抜くだけの Material で OK です。

Custom Depth を使う

今回は全く必要無いのですが、とりあえず使ってみた版です。

まずは、BP 内の撮影対象である SkeletalMeshRender CustomDepth Pass を有効にします。Level に配置して、Buffer Visualization で確認できれば大丈夫です。

続いて Post Process Material です。正直、もっといい方法がありそうな気がします。特に SkySphere を抜くために if 式を使ってるあたりが ad-hoc 感が出ています。

この場合は Render Target の結果がこれまでとは変わってきますが、キャラクターが反転した Alpha になっているのは変わらないので最終的な Material は同じになります。

参考にさせていただいた記事

コード

GitHub - dany1468/UE5_RenderTarget_SceneCapture_Test