ポストプロセス マテリアルを使用すると、ポストプロセスで使用できるマテリアルを設定して、ダメージ、エリア タイプの効果、 またはポストプロセス マテリアルの使用が不可欠なゲーム全体の外観に視覚的な画面効果を作成することができます。
次のセクションでは、ポストプロセス マテリアルの設定、使用可能な設定、さまざまなバッファを使用した独自のポストプロセス マテリアルのセットアップ方法の例、 ポストプロセス マテリアル間のブレンドなどについて学習します。
ポストプロセス グラフ
Unreal Engine にはポストプロセス ノードのグラフに基づいた複雑なポストプロセスがあります。ポストプロセス マテリアル は 特定の位置に追加で挿入することができます。すべてのグラフでダンプされた内容を確認するには よくある質問 の r.CompositionGraphDebug を参照してください。 グラフはポストプロセス処理のみではなく、ライティングの一部も処理しています。
ほとんどの場合、グラフは中間レンダー ターゲットを自動作成します。つまりその前の色とブレンドしたい場合、 (PostProcessInput0 からの入力を使って) シェーダーでブレンドする必要があります。
ポストプロセス マテリアルは、必要な場合に限り注意して使用してください。色補正や調整、ブルーム、被写界深度や他の様々なエフェクトに対しては、可能な限り最適化がされていてより効率的な Post Process ボリュームに継承された設定を使うようにしてください。
ポストプロセス マテリアルを使用する
ポストプロセス設定 (通常はポストプロセスボリュームまたはカメラ設定で定義) を使って、いわゆるブレンド可能なアセットをブレンドすることができます。 現時点でブレンド可能なアセットは、マテリアル と マテリアルインスタンス のみです。アンリアル エンジンにはいくつかのポストプロセス マテリアルがありますが、 プログラマーの支援なしに独自の カスタム仕様のポストプロセス を作成することができます。
1 つ以上のポストプロセス マテリアルを [Blendables] セクションのポストプロセス ボリュームへ割り当てます。まず [+] キーを押して新スロットを追加し、 コンテンツ ブラウザ でマテリアルを選択して左矢印キーで割り当てます。ここでの順番は重要ではなく、使用していないスロットはただ無視されます。

ポストプロセス マテリアルの重要な設定
ポストプロセス マテリアルではマテリアル ドメインで [Post Process (ポストプロセス)] を指定する必要があります。

このマテリアルでは新しい色の出力に EmissiveColor のみを使用するようにします。さらに、ポストプロセス処理中でこのパスを適用するタイミングを定義することが可能であり、 複数の場合は処理順序 (優先順位) を定義することができます。

ブレンド可能な位置 | 説明 |
---|---|
Before Tonemapping (トーンマッピング前) | シーン テクスチャ式の Post Process Input に 0 が使用されている場合、すべてのライティングはシーン カラー付きの HDR で提供されます。テンポラル アンチエイリアシング (TAA) および GBuffer ルックアップの問題を修正します。たとえば、深度と法線を使用すると問題が発生します。 |
After Tonemapping (トーンマッピング後) | トーン マッピングとカラーグレーディングが完了した後にポストプロセスが行われることを示すオプションです。色が LDR で、必要な精度と帯域幅が少ないため、パフォーマンスに適した場所です。このオプションを使用すると、SceneTexture 式の Post Process Input 2 と 3 を使用して、パイプラインでのシーンカラーの場所を制御します。Input 2 はトーンマッピング前にシーン カラーを適用します。Input 3 はトーンマッピング後にシーン カラーを適用します。 |
Before Translucency (透過処理前) | これはパイプライン内で 「Before Tonemapping (トーンマッピング前)」 より早く、透過がシーン カラーと組み合わさる前になります。SeparateTranslucency が、法線透過より後に合成されることに注意してください。 |
Replacing the Tonemapper (トーンマッパの置き換え) | PostProcessInput0 は HDR シーンカラー、PostProcessInput1 は SeparateTranslucency (アルファはマスクです) を提供し、PostprocessInput2 には解像度の低いブルーム入力が付いています。 |
通常のポストプロセスの入力は、前のパスから入ってきます。PostProcessInput0 を使用する場合、 SceneTexture マテリアル式から色にアクセスできます。SceneColor を使用した場合、適切な結果が得られないことがあります。
異なるマテリアル インスタンス間のブレンド
ポストプロセス ボリュームでは、複数のポストプロセス マテリアル間で滑らかな遷移を簡単に設定することができます。ここでは「Unbound」にマークが付けられ、より大きなブレンド半径を持つボリュームを使用しています (例:1000)。
![]() |
![]() |
---|---|
Unbound に設定したポストプロセス | ボリュームを結合するポストプロセス |
各ボリュームで同一マテリアルの異なるマテリアル インスタンスを指定します。色はこの 2 つのマテリアル インスタンスに対して違う設定ができるマテリアル パラメータとして指定されます。
![]() |
![]() |
---|---|
赤のマテリアル インスタンス | 緑のマテリアル インスタンス |
Blend Radius が以下の範囲内の場合、カメラ位置に合わせてボリューム設定が使用されてブレンドされます。
![]() |
![]() |
![]() |
---|---|---|
Unbound Post Process Volume Material Instance (赤) を 0.75 に設定 | Blend Radius が 1000 | Unbound Post Process Volume Material Instance (緑) を 0.75 に設定 |
カメラの移動を介して、2 つのエフェクト設定をスムーズに順番に切り替えることができます。
2 つのボリュームを持つレベルを上から見ると、以下のような図になります。境界をもたない大きなボリュームは赤のマテリアル インスタンス、小さなボリュームは緑のマテリアル インスタンスを持ち、ブレンド可能になっています。 小さなボリュームは優先度が高くなります。マテリアルのパラメータはカメラ位置に応じてブレンドされます。 かすかな境界部分は、ボリュームによって指定される BlendRadius プロパティで定義され、ボリュームの形状を拡張します。
正しくセットアップすると、すべてのブレンドは期待どおりに行われます。


この 2 つのセットアップの違いは、マテリアル (スカラーまたはベクター) のパラメータで指定するデフォルト値です。 良いセットアップでは、パスが何もエフェクトを持たないかのように見える値になっています (例:白に乗算、または 0 で線形補間)。
2 つのセットアップからわかること: カメラがいずれかのボリュームの影響範囲外にあるとポストプロセスのパスはレンダリングされません (グレーのグリッドに視覚化)。 いずれかのボリュームの影響範囲内にあると、正しいブレンドが表示されます。
悪いセットアップ: カメラが影響半径に入るときの遷移がぎこちなく見える理由は、デフォルト パラメータを誤って指定したからです。
良いセットアップ: カメラに影響半径が入る遷移がうまく隠されていて、ボリュームの色の遷移がスムーズになります。
すべてのマテリアル インスタンスのプロパティは、プロパティのチェックボックスのチェック状況に関係なくブレンドされます (チェックが入っていなければ、親からのプロパティをブレンドします)。チェックされていないプロパティは何のエフェクトも持たないという点で、ポストプロセス設定とは異なります。 つまり、マテリアル インスタンスをブレンドすると、すべてのプロパティがブレンドされます。
「SceneTexture」マテリアル式
SceneTexture マテリアル式をマテリアルに追加して、式プロパティで参照するテクスチャを選択します。

以下のように、ノードには任意の入力値と複数の出力値があります。

UV 入力値で、テクスチャ ルックアップ位置を指定することができます (Color 出力値のみに使用)。 Color 出力値は 4 チャンネル出力 (実際のチャンネル割り当てはシーンテクスチャ ID に依存します) です。Size は、テクスチャの幅と高さを持つ 2 コンポーネント ベクターです。この逆数 (1/幅、1/高さ) は、 InvSize 出力値で有効です。以下の例のように、 隣接するサンプルの参照に便利です。

このマテリアル式は、現ピクセルと隣接するピクセルとの深度の違いを計算します (例、In = 0,1 で、下のピクセルへデルタ値を返します)。
GBuffer プロパティの使用
GBuffer は、シェーディングを計算 (ライトがマテリアルとどのように相互作用するか) するためのマテリアルを格納する複数のテクスチャ (例:サブサーフェス/スペキュラカラー、ラフネス) や、 ライティングなしのオブジェクト属性 (例:法線、深度) を含みます。ディファード レンダラでは、最初に GBuffer をレンダリングしてから GBuffer 属性と一緒に すべてのライティング (ディファード) を計算します。ディファード シェーディング パスを使用する場合 (例:DirectX 11 またはハイエンドの OpenGL)、ポストプロセス処理中にこれらのバッファにアクセスすることができます。
アンチエイリアス処理の場合は、GBuffer ピクセル/テクセルが出力ピクセルと 1:1 で関連付けられなくなったため、アクセスしづらくなります (以下のセクション参照)。
CustomDepth
オブジェクトを別の深度バッファ (カスタム深度バッファ) でレンダリングすると、そのオブジェクトをマスクすることができる独立した機能です。 ドローコールは増えますが、マテリアルは追加しません。深度のみを出力するため、レンダリングは比較的低負荷です。この機能はメッシュで有効にすることができます (例:スタティックメッシュ プロパティやレンダリングのカスタム深度):

このシーンでは 2 つのオブジェクトでこの機能を有効にしていますが、ポストプロセス パスがコンテンツを視覚化しなければ、この機能は不可視のままです。

以下は CustomDepth を視覚化したものになります。

視覚化のために使用したマテリアルは以下のとおりです。

CustomDepth Stencil
Custom Depth Stencil (カスタム深度のステンシル) は、ステンシル (別名カットアウト) を使用することができ、レンダリングされたオブジェクトの Custom Depth の拡張で、 オクルードされたオブジェクトを視覚化したり、オブジェクトの輪郭を描画したり、特定の角度でのみ見えるようにするなど、下の例のような視覚的に面白い作業をすることができます。シーンのアクタのステンシルへのアクセスがあると、実行可能になることが 大幅に増えます。ステンシル値を有効にして割り当てるには、以下の設定を使用します。

このシーンでは、3 つのオブジェクトで Custom Depth を有効にし、それぞれに Custom Depth Stencil Value (カスタム深度のステンシル値) を設定しましたが、コンテンツを可視化するポストプロセス パスがなければ、この機能は見えないままになります。

ポストプロセス マテリアルを設定すると、Custom Depth Stencil の見え方を視覚化することができます。オクルードされたオブジェクトは使用された Custom Depth Stencil Value に基づいてランダムに割り当てられた色でレンダリングされます。

視覚化のために使用したマテリアルの構成です。
画像をクリックすると、拡大表示されます。
Custom Depth Stencil の使用方法はこれだけではありません。この特別なマテリアル構成では、ステンシルは 1 から 255 までの値を使用するように分割されています。 その間の値についてはマスクを使用し、その値に対してランダム色を作成するだけでなく、カスタムデプス ステンシル値と色が一緒に変わるようにします。 そして最終的に、オブジェクトがオクルードされた場合にのみステンシル色が付くようにマスクが生成されます。
テンポラル アンチエイリアシングまたは GBuffer でジッターが生じる理由
テンポラル アンチエイリアスは Unreal Engine の独自の機能で、パフォーマンス負荷をほとんどかけずに画像品質を大幅に向上させます。
デフォルト設定では、ポストプロセス マテリアルはポストプロセス グラフの最後に挿入されます (トーンマッパの後)。つまり、トーンマッピング、カラー グレーディング、そしてテンポラル アンチエイリアシングが適用された後に 最終的な LDR カラーを取得します。パフォーマンスや使いやすさの観点から、多くの簡易なポストプロセス エフェクトにとって最高の場所です。
以下は特定のオブジェクト周りのシルエットを可視化させるためにカスタムの深度入力値をどのように使用したかの例です。

前の画像ではシルエットにアンチエイリアス処理が見受けられませんが、動作中はシルエットに 1 ピクセル程度のジッター (小刻みな揺れ) が見えます。 それは、テンポラル アンチエイリアシングは、シーン全体のレンダリングを各フレームでサブ ピクセルずつ移動させるためです。アンチエイリアス処理された最終画像を作成するために、複数のフレームが一緒に結合されます。 しかしながらこの問題は、ポストプロセス グラフでマテリアルの位置をより前方に移動することで修正できます。
結果は次のとおりです。

安定したアンチエイリアス処理が施された画像となります。動作中はテンポラル アンチエイリアシングでいくつかのアーティファクトに気づくかもしれません。この機能は古い画像を置換するために深度バッファを使用しています。オブジェクトの内側でボーダーがレンダリングされた状態で問題なく機能しますが、 オブジェクトの外側では深度バッファを調整する必要があります (パフォーマンスの負荷が余分にかかるためまだ行っていません) が、 これは理想的ではありません。
UV と ScreenPosition
ポストプロセス マテリアルを使って、画面ソートされたバッファの中をルックアップして見ることができますが、適切な UV を知る必要があります。 マッピング オプションを [ViewportUV] に設定した ScreenPosition マテリアル式は、ビューポートの左上 0,0 と右下 1,1 に UV を出力します。 一方、このマテリアル式で SceneTextureUV マッピング オプションを使うと異なる結果を得ることができます。実際のテクスチャ (もっと正確にはレンダー ターゲット) は、ビューポートよりも大きい可能性があるためです。 このテクスチャを複数のビューポートに共有し、最大のものがすべてのビューポートに使用されるため、エディタで大きくなる可能性があります。 ゲームではさらに大きくなる場合があります (例、SceneCaptureActors はビューポート、マチネブラックボーダー、分割画面、VR などが小さくなる)。 SceneTextureUV オプションを使うと、大きいテクスチャ用の UV が提供されます。相対オフセット (ピクセルサイズのエッジ探知など) だけが必要な場合は、正しいサイズでスケールする必要があります。 SceneTexture マテリアル式には、サイズの出力とサイズ反転の出力があります (ピクセル オフセットに効果的で便利です)。 すべてをテストするには、様々なビューポート コンフィギュレーションをテストすることができるコンソール変数 r.ViewPortTest を使います。
フィルタ済みテクスチャ ルックアップ
SceneTexture マテリアル式には、[bilinear (バイリニア)] でフィルタ処理したルックアップを取得するためのチェックボックスがあります。このオプションを使うと、レンダリング速度が落ちるため、必要な場合のみ使用してください。 スクリーン空間テクスチャの多くはフィルタ処理をサポートしていません (GBuffer など)。このプロパティを公開していないと、適宜エンジンはデータを圧縮できるようになります (パッキングでフィルタリングが回避されます)。
トーンマッパの置き換え
トーンマッパでブレンド可能な位置を置き換えることによって、エンジン トーンマッパを独自のものでオーバーライドすることができます。この機能は開発途中であり、今後変更される場合があります。また、機能はまだ完全に実装されていません。

ポストプロセス設定パラメータをトーンマッパへ公開していますが、大幅な変更が予想されます。 値はマテリアル パラメータとして公開され、正確な名前が必要になります。
ベクター パラメータ:
Engine.FilmWhitePoint
スカラー パラメータ:
Engine.FilmSaturation
Engine.FilmContrast
パラメータを取得するには、ポストプロセス マテリアルからマテリアル インスタンスを作成する必要があります。
独自のパラメータを使って、他のポストプロセス マテリアルのようにブレンドすることも可能です。
既知の問題
- マテリアル式 SceneTexture
- Separate Translucency が機能しない
- 特定のパスで特定のルックアップが作動しない
- Material Function がエラーを報告しても Post Process ドメインのマテリアルで使用できる
- マテリアル
- ポストプロセス マテリアルの UV が 0 から 1 の範囲にないことがあります (たとえば、エディタでビューポートを小さくしたとき)。ルックアップと一致しますが、ビネット エフェクトなどの実装が難しくなります。
- アルファ値の出力がいまだサポートされていません。代わりにオパシティを使用してください。
- テンポラル アンチエイリアシング アップサンプリング とワールド位置を使用する場合、テンポラル アップスケーリング (TAAU、DLSS、Temporal Super Resolution) の使用はアンチエイリアシングされないため出力にエイリアシングが発生するため、その後に深度バッファのサンプリングが必要です。そのため、テンポラル アップスケーリングの前にエフェクトを作成することを推奨します。
- ブレンディング
- ブレンド半径で 2 つのポストプロセス ボリュームをブレンドするとき、遷移がぎこちない場合があります。デフォルト値であるマテリアル インスタンスを設定した境界をもたないボリュームを使用することで防ぐことができます。
よくある質問
-
入力値に「Lighting only mode (ライティングのみのモード)」のテクスチャを使用できますか。
できません。中間段階でこのデータは有効ではありません。このビューモードではマテリアルカラーを無視してこれを 生成しています。高速オプションにするには大部分のレンダリング コードを再構築する必要があります。
-
SceneColor のルックアップで表示されるバンディングが PostProcessInput0 の使用時に見えないのはなぜですか。
SceneColor が使用されると、現在の書き込み対象となるテクスチャでのルックアップを可能にするために、シーンの低解像度コピーを作成します (一般的にはこの処理が不可能なメッシュへレンダリングしています)。 ポストプロセス処理では PostProcessInput0 を使用します。
-
ポストプロセス処理に必要なメモリ使用量はどのくらいですか。
メモリの負荷はスクリーンの解像度次第です。トーンマッピング処理の前に HDR (ピクセルあたり 8 バイト)、その後は LDR (ピクセルあたり 4 バイト) を使用します。
-
ポストプロセスのレンダリング負荷を低くする方法を教えてください。
ターゲット プラットフォームを測定し、テクスチャ ルックアップ数を低めに維持、演算を少なくし、依存するテクスチャ ルックアップを減らして、 ランダム化したテクスチャ ルックアップを回避します (テクスチャのキャッシュ ミスが原因で遅くなることがあります)。
-
パスはいくつ使用できますか。
パスの使用ひとつひとつがパフォーマンス負荷に加算されます。パスを結合し、パスのアクティベートは必要時のみにとどめてください。一般的なゲーム機能、 たとえば、パフォーマンスを高めるためにノイズをエンジンパスへ追加することが可能です。
-
ポストプロセス処理およびブレンドにかかる CPU のパフォーマンス負荷はどのくらいですか。
マテリアルのブレンドはとても低負荷です。すべてのマテリアル インスタンスのプロパティは、ブレンドされ、こうした設定を持つひとつのポストプロセス マテリアルのパスだけがレンダリングされます。
-
正しい TemporalAA を取得するためには「Before Tonemapper」を使用する必要があります。いずれかの色を使用するとトーンマッピングが適用されて、違った見た目となってしまいます。どうしたら回避できますか。
この問題に対する簡単な解決法はありません。逆トーンマッピング演算 (高負荷) をする必要があります。明暗順応によって、 色の表示が異なる場合もあります。EyeAdaptation レベルを SceneTexture に公開して補正することができます。
-
ポストプロセス グラフのダンプ内容をすべて取得する方法を教えてください。
r.CompositionGraphDebug でグラフのログをコンソールへ記録することができます。次に例を示します。
FRenderingCompositePassContext:Debug 'PostProcessing' --------- Node#1 'SceneColor' ePId_Output0 (2D 1136x768 PF_FloatRGBA RT) SceneColor Dep: 2 Node#4 'Velocity' ePId_Output0 (2D 1136x768 PF_G16R16 RT) Velocity Dep: 1 Node#2 'SceneDepthZ' ePId_Output0 (2D 1136x768 PF_DepthStencil) SceneDepthZ Dep: 1 Node#5 'MotionBlurSetup0MotionBlurSetup1' ePId_Input0: Node#4 @ ePId_Output0 'Velocity' ePId_Input1: Node#1 @ ePId_Output0 'SceneColor' ePId_Input2: Node#2 @ ePId_Output0 'SceneDepthZ' ePId_Output0 (2D 568x384 PF_FloatRGBA RT) MotionBlurSetup0 Dep: 2 ePId_Output1 (2D 568x384 PF_FloatRGBA RT) MotionBlurSetup1 Dep: 1 Node#6 'QuarterResVelocity' ePId_Input0: Node#5 @ ePId_Output0 'MotionBlurSetup0MotionBlurSetup1' ePId_Input1: ePId_Output0 (2D 284x192 PF_FloatRGBA RT) QuarterResVelocity Dep: 1 Node#7 'VelocityBlurX' ePId_Input0: Node#6 @ ePId_Output0 'QuarterResVelocity' ePId_Input1: ePId_Output0 (2D 284x192 PF_FloatRGBA RT) VelocityBlurX Dep: 1 ...