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 に表示
Image
の Widget コンポーネントの 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)2D
の Capture Source
の設定です。
Final Color にしないと、Post Process が適用された状態のキャプチャが取得できないためここを変更します。
SceneCapture(Component)2D
の Post Process Materials に作成した Material を指定すれば完了です。
最初の Hidden Actors を指定したのと同様にキャラクターだけがマスクされた Rendar Target の結果が得られると思います。
よって、このケースでは Hidden Actors の時と同じく反転した Alpha で抜くだけの Material で OK です。
Custom Depth を使う
今回は全く必要無いのですが、とりあえず使ってみた版です。
まずは、BP 内の撮影対象である SkeletalMesh
の Render CustomDepth Pass
を有効にします。Level に配置して、Buffer Visualization で確認できれば大丈夫です。
続いて Post Process Material です。正直、もっといい方法がありそうな気がします。特に SkySphere を抜くために if
式を使ってるあたりが ad-hoc 感が出ています。
この場合は Render Target の結果がこれまでとは変わってきますが、キャラクターが反転した Alpha になっているのは変わらないので最終的な Material は同じになります。
参考にさせていただいた記事
- Riustuue comments on How do you do transparency with Scene Capture 2D using Final Color?
- Scene capture 2d with post processing material - Rendering - Unreal Engine Forums
- 煙に背後のオブジェクトのシルエットを写す [後編] | Draw silhouettes of objects behind smoke Part.2 - ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog
- Scene Capture 2D Transparent Material : unrealengine
- ブループリントおよびレンダー ターゲットでテクスチャを作成する方法 | Unreal Engine ドキュメント
- Render 3D objects in UMG Widget/HUD | EngineUnreal
- Unreal Engine 4 Tutorial - Equipment - Part 1 3D Mesh Widget - YouTube