執筆バージョン: Unreal Engine 5.4
|
はじめに
今回の記事は、ポストプロセスマテリアルで「霧っぽいもの作れないかな?」と思って試してみた記録です。
自分なりに調べて理解した内容を、チュートリアル形式でまとめました。
手軽に雰囲気フォグを実装したいときの参考になればうれしいです。
それでははじめます。
Part 1 – 「距離で」霧っぽいポストプロセスマテリアルを作る
Step 1 -サードパーソンテンプレートでプロジェクトファイルを作成
今回はバージョン5.4を使用しています。まずはサードパーソンテンプレートでプロジェクトファイルを作成してください。
(詳しいやり方は割愛します)
Step 2 -ポストプロセスマテリアルの作成と設定
コンテンツブラウザで右クリック → 「Material」を作成

名前を PPM_DistanceFog にします。
今回はUnreal Engineの推奨命名規則に従いマスターマテリアルはPPM_をプレフィックスとして付けます。
名前は分かりやすく距離フォグ PPM_DistanceFog としました。
※パラメーター名は UpperCamelCase(単語の頭を大文字にする書き方)で統一していきます。
マテリアルを開いて、以下の設定を変更します。
Material Domain を Post Process にします。

次に、Blendable Location を検索して Scene Color After DOF を選びます。

なぜこうするのか?
Blendable Location とは、
「このマテリアルを、レンダリングのどの段階で処理させるか」を指定する項目です。
Scene Color After DOF は、
DOF(被写界深度)のボケ処理が済んだ後の画面に対して効果を加えるタイミングです。
他のLocationだと、処理タイミングや対象が合わないので、 今回の用途には適していません。
気になる方は、他のLocationも試してみるか、公式ドキュメントを参照してみてください。
ちなみに、半透明(Translucent)マテリアルには、今回の Fog は効きません。
そういう仕様なので、その点はあらかじめご理解いただけると助かります。
※この記事は Unreal Engine 5.4 をもとにしています。
バージョンによって Blendable Location の項目が異なる場合があります。
作成するフォグのイメージは、カメラから数メートル先に霧がかかって、遠くが薄っすらと見えるような感じです。では順を追って組んでいきましょう。
まず、SceneTextureノードを作成します。
ノードグラフ上で右クリックしてScenetと検索すれば出てきます。


このノードは現在描画されている画面の絵(シーンカラー)を取得するためのものです。
ノードを選択した状態で、DetailsのUMaterial Expression Scene Textureから
Scene Texture IDにPostProsessInput0を指定します。

SceneTexture ノードでは「どの画像情報を使うか」を Scene Texture ID で選びます。
今回は画面の絵そのものを加工したいので、基本の PostProcessInput0 を選びます。
ちなみに、他の ID(SceneColor や CustomDepth など )は特殊な情報を扱います。
PostProcessInput1〜6 は、ポストプロセスマテリアルを複数重ねる場合に使用します。
通常は Input0 だけで十分です。
次に、ScreenPositionノードを作成します。
これは画面のピクセル位置(UV座標)取得できるノードです。
ポストプロセスマテリアルは、画面全体に効果をかけるためのマテリアルなので、
このようにScreenPositionをつなぐことで画面全体の座標を UV として扱うことができます。
取得したUVを、SceneTextureノードのUVsに繋げます。
ポストプロセスは基本的にEmissive Colorのみを使用します。
SceneTexture の出力は RGBA なので、Emissive RGB に繋ぐために、
ComponentMask で RGB だけを取り出します。

この状態で、画面に描かれている元の絵をそのまま再表示できるようになります。
次に、フォグの色を合成していきます。
Vector3 ノードで色を指定し、分かりやすくするために、青に設定します。
後で、マテリアルインスタンスから、色を変えられるように、
パラメーターに変換して、名前を FogColor とします。
次に、Lerpノードを作成します。
SceneTexture(シーンカラー)をAに、FogcolorをBに接続し、Aplhaに 0.5 を入れて合成します。

この状態で、Fogの色がシーンカラーに合成される準備ができました。
ここから実際にマテリアルを画面に適用して確認してみます。
Post Process Volumeを選択して検索欄に mat と打つと、
Post Process Materialの項目が見つかります。

プラスボタンを押して、プルダウンからAsserrefarenceを選びます。

マテリアルインスタンスを作成してPPMI_DistanceFogと名前を付けて、割り当てます。

すると画面全体に青い色が乗ってるが確認できるはずです。
※もしもPost Process Volume がない場合は自分で配置してください。
全体に適用させるには「Infinite Extent(Unbound)」のチェックを入れておく必要があります。
Before
ポストプロセスマテリアル設定前

After ポストプロセスマテリアル設定後
Alpha 0.5

試しにLerpの値を1.0にすると画面はほぼ真っ青になります。
Alpha 1.0

次に、カメラから、一定の距離でフォグがかかり始めるようにする処理を組んでいきます。
まずはカメラの位置を取得します。
右クリックして「Camera」と検索し、
CameraPosition ノードを作成します。 (検索キーワードCameraPositionWS )
「WS」は World Space(ワールド空間)の略です。
このノードは、今カメラがどこにいるか(ワールド座標)を返してくれます。
つまり、画面を見ている「出発点」のようなものです。


次にAbsolute World Position ノードを作成します。(検索キーワードWorldPosition)
このノードは、今、画面に描かれているピクセルが「3D空間のどこにあるか」を表す
ワールド座標を取得します。
つまり、カメラから見た「そのピクセルの実際の位置」が分かるノードです。


次に、カメラからピクセルまでの距離を計算します。
ノードの組み方は以下の通りです。
Subtract ノードを作成
Absolute World Position(ピクセルの位置)を A に
Camera Position(カメラの位置)を B に繋ぎます。
これは「ピクセルの位置 – カメラの位置」、つまり2点の差(ベクトル)を求めています。
Length ノードを作成
Subtract から出たベクトルをそのまま繋ぎます。
Length ノードは、そのベクトルの長さ(距離)を返してくれます。

「差って何?ベクトルって?長さってどういうこと?」と思うかもしれませんが、
ここでは 「A地点とB地点の距離を出すために位置の差を使っているんだな」
くらいの理解で大丈夫です。
ちなみに、Subtract と Length を組み合わせなくても、
Distance ノード を使えば、
2つの位置ベクトルから一発で距離(長さ)を出すこともできます。
ただし、今回は仕組みを理解しやすくするために
Subtract → Length の流れで組んでいます。
ベクトルや距離(長さ)の計算には「三平方の定理」などの知識が必要ですが、
細かい仕組みは気にせず、先に進みましょう。
次に、Multiplyで「0.001」 をかけます。
そしてその結果を、一旦 LerpのAlpha に入れてみてください。

ここで何をしているかというと──
LerpのAlphaは、基本的に「0〜1の範囲」でしか効きません。
でも、画面の奥のピクセルは「数千単位」の距離(値)になることもあります。
そのままでは範囲が大きすぎて使いにくいので、スケールを小さくするために0.001を掛けて、
0〜1の範囲に近づけたというわけです。
霧がかかり始める距離のスケールを調整する、調整用のパラメーターとして使用します。
FogDistanceScale という名前にします。
Applyして、3D画面を見ると、奥が霧がかかったような見た目になります。

続けて以下のノードを作成して繋げます。
- Saturate で値を扱いやすくするために、0〜1の範囲に制限します
- Power で霧のかかり具合のコントラスト(急激に変化するか、なだらかか)を付けます。
パラメーター名:FogDistanceContrust
- Multiply で最終的な霧の強度(濃さ)を調整します
パラメーター名:FogIntensity
これで、距離による霧の出方をある程度自由にコントロールできるようになります。

Step 4 – マテリアルインスタンスで微調整
最後に、先ほど割り当てたマテリアルインスタンス(PPMI_DistanceFog)の各パラメーターを調整して、
距離による霧の出方をお好みに合わせて微調整してみてください。

プレイして確認してみてください。
今回は以上です。おつかれさまでした!
【参考リンク】
ポストプロセスマテリアル
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/post-process-materials-in-unreal-engine?application_version=5.5
Blendable Location
https://forums.unrealengine.com/t/ue-5-explained-blendable-locations-for-post-process-materials/2102095
レンダリング
https://www.docswell.com/s/EpicGamesJapan/5QRL3V-ue5-renderingflow-2024-basic