※この記事で使用しているUnrealのVersionは04.21.1です。

※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト

CustomStencilでアクター・コンポーネント単位でPost処理をする  レベル 【★★】

例えば画面全体をぼかした表現をしたいけど主人公などはぼかしたくない、などのときにアクター・コンポーネント単位でポストを使い分けられるととても便利だと思います。

アクター・コンポーネントごとに使い分ける方法として、よく「CustomDepth」を用いた方法が使われます。

この「CustomDepth」はアクター・コンポーネントごとの「詳細」ウィンドウ内の「Rendering」→「Render Custom Depth Pass」というチェックを入れることで、ポストプロセスマテリアル内で「SceneTexture」から「CustomDepth」というSceneTextureIDからチェックを入れたアクター・コンポーネントのみDepth値を取得することが出来ます。

使い方例:
まずPostProcess用マテリアルを作成します。

「詳細」→ 「Material」→「Material Domain」の項目を「PostProcess」にし、処理を書きます。

適当なレベルにわかりやすいように何個かキューブをおいて、その中の一つの「詳細」→「Rendering」→「Render CustomDepth Pass」のチェックを入れます

レベル内に「PostProcess Volume」を配置し、
「詳細」→「Rendering Features」→「PostProcess Material」の配列の+を押して、出てきたプルダウンから「アセットリファレンス」を選択→その後出てきたマテリアルを設定する項目に作成したPostProcess用マテリアルを設定します。

さらに、 「詳細」「PostProcess VolumeSettings」→「InfiniteExtent(Unbound)」 にチェックを入れることで、ボリューム内にカメラがなくてもPostを適応するようにします。
これで、CustomDepthを設定したアクター・コンポーネントのみ見た目そのままで、それ以外は全体的に暗くなります。

こんな感じで、手軽にアクター・コンポーネント単位でPostEffectをかけることができました。

でも、このCustomDepthだけでは3種類以上のエフェクトをアクターごとに使い分けることができません。

どうしても3種類以上のEffectを使い分けたいというときに登場するのが「Custom Stencil」という機能です。

使用するにはプロジェクト設定でStencilPassの描画を有効にしなければなりません。

エディター左上の「編集」→「プロジェクト設定」を選択し、
「Rendering」→「PostProcessing」→「CustomDepth-Stencil Pass」という項目を「Enable With Stencil Pass」に設定します。


この「CustomStencil」というのは、「CustomDepth」と同じくアクター・コンポーネント単位で設定することができ、値は0~255の整数で設定します。

「詳細」→「Rendering」→「Render CustomDepth Pass」 のチェックが入った状態で、
「詳細」→「Rendering」 →「CustomDepth Stencil Value」を任意の値にします。

設定した値をMaterialのグラフで取得する際は「SceneTexture」ノードのSceneTextureID を「Custom Stencil」にすることで取得できます。

使用例:

こんな感じでマテリアルの処理を書きます

MF_PixelOffsetの中身

これをPostProcessVolumeに適応すると、こんな感じになります。(わかりづらいかもです)

なお、ビューポート左上にある表示モード切替で、「バッファを可視化」→「カスタムステンシル」にチェックを入れると、StencilValueが設定されているアクター・コンポーネントのみ数字が浮かび上がるような見た目になります。

雑な紹介で申し訳ありませんが以上となります。

※紹介しておいてあれですが、Stencilを使うと描画パスが増えてしまうのでそれだけ処理が遅くなります。
ご利用はご計画的に。

※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト