こんにちは、情熱開発部プログラム2課の今井です。
12月に入り年の瀬も近づいてきましたね。
クリスマスや年末に向けてたくさんゲームソフトが発売される時期でもあります。
年末年始にプレイする予定のゲームソフトはもう決まっていますか?
そんなゲームソフトをプレイしている時によく見かける手法「背景アルファディザ」について説明したいと思います。
※使用バージョン
Unreal Engine:5.5.4
背景アルファディザとは

上の画像のようにプレイヤーがオブジェクトで隠れてしまう際にオブジェクト側の各ピクセルを描画する、描画しないで疑似的に透かし、プレイヤーを認識させる手法です。
この手法の呼び方はいくつか存在しますが本ブログでは「背景アルファディザ」という名称で説明します。
このように半透明ではなくアルファディザで表現することで、通常の半透明表現に比べて以下のようなメリットがあります。
・描画負荷が軽い
・描画順による不具合の削減
・深度値を利用
背景アルファディザの種類
背景アルファディザにはいくつか種類があります。
・カメラに近いほどアルファディザさせる方法
・カメラとキャラの間のオブジェクトをアルファディザさせる方法
など
方法についてはゲーム内容や理想の処理負荷によって変わってきます。
実装
それでは今回は、「カメラとキャラの間にあるオブジェクトをアルファディザさせる方法」を実際に実装してみましょう。
今回はサードパーソンプロジェクトにスターターコンテンツを含めてプロジェクトを作成しました。
さっそく障害物となるモデルをレベルに配置していきましょう。スターターコンテンツ内の「Shape_Cylinder」をレベルに配置し、詳細のコリジョンプリセットからCameraを無視するように設定します。


次に配置したモデルに適用する背景アルファディザ用のマテリアルを作成します。
コンテンツブラウザで新しくマテリアルを作成した後、マテリアルを開きBlend ModeをMaskedに変更します。
Maskedに変更したことによってオパシティマスクノード入力が利用できるようになります。


下のように、モデルの座標とカメラの距離からディザ処理ができるようにノードを組みました。
DitherTemporalAAノードとはMaskedのマテリアルでもTAAを利用し“半透明のような見た目”を見せるためのノードです。
Masked マテリアルは本来「完全に描画するか、しないか」しか扱えませんが、DitherTemporalAA ノードを使うことでピクセル単位で描画のON/OFFを切り替え、時間方向の補間によって擬似的に半透明のような見た目を表現できます。

さて、実行して確認してみましょう!
カメラから近いモデルに対して、しっかりとアルファディザ処理がされています!

インスタンシングの際の問題
さて次の画像ですがこれはFoliage ツールで先ほどのモデルを3つ配置した際のアルファディザです。
画像では3つのモデルが同じ濃さでアルファディザされています。

Foliage ツールで配置されたものはインスタンシングされたモデルになります。
原因は、Object Position (Absolute) ノードから取得される座標が、インスタンシングされたすべてのモデルで共通の値になってしまうためです。
このままゲームに処理を利用してしまうと、画面内の木などが一斉に透けてしまい、不自然な見た目になってしまいます。
インスタンシングの解決
上記の通り、現在のままでは同じインスタンシングのモデル座標が共通になっているのでインスタンシングの際は各モデルごとの座標を取得できるようにします。
この問題を解決するためにTransformPositionノードを利用します。

TransformPositionの選択した状態で詳細→マテリアルエクスプレッショントランスフォームポジション→Sourceを「Instance & Particle Space」に変更します。
これにより、「オブジェクト全体の共通座標」ではなく、「各インスタンスごとの座標」を取得できるようになります。

Object Position (Absolute)ノードの部分を下のようにTransformPositionに入れ替えます。

これで実行してみましょう!
配置した3つのモデルのうちカメラに一番近いモデルのみアルファディザが掛かるようになりました。

最後に
今回このブログを通して一番伝えたかったことは、インスタンシング時に「どの座標の値を取得しているか」を正しく意識することの重要性です。
今回はアルファディザの実装を通してこの問題に直面しましたが、エフェクト制作や HISM / ISM を扱う場合でも同様の問題に直面することがあります。
また、今回はインスタンシング時のモデルの原点位置を取得していますが、場合によってはその判定だけでは不十分なこともあります。モデルの形状に応じた判定が必要になるケースもある場合もあるかもしれません。
どのような処理にするべきかは、ゲーム内容やターゲットスペックなどを総合的に判断して決めることが大切です。
参考文献
以下のサイトを参考にさせていただきました。ありがとうございます。
・【ゼロからアンリアルエンジン5】㉔モン●ンラ●ズのようなキャラとカメラの間の障害物を半透明にしよう
・キャラを透過なんかさせなくても良いんじゃね?
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。




