Language:
Page Info
Engine Version:
The translation of this page is out of date. Please see the English version for the latest version of the page.

ポストプロセス マテリアル

Teaser3.png Teaser0.png Teaser1.png Teaser2.png

ポストプロセス グラフ

アンリアル エンジンにはポストプロセス ノードのグラフに基づいた複雑なポストプロセスがあります。ポストプロセス マテリアル は 特定の位置に追加で挿入することができます。全グラフのダンプされた内容を確認するには 以下のFAQ に掲載した r.CompositionGraphDebug を参照してください。 グラフはポストプロセス処理のみではなく、ライティングの一部も処理しています。いずれは、マテリアル エディタからより多くの部分を カスタマイズできるようにする予定です。

ほとんどの場合、グラフは中間レンダリング ターゲットを自動作成します。つまりその前の色とブレンドしたい場合、 (PostProcessInput0 からの入力を使って) シェーダーでブレンドする必要があります。

ポストプロセス マテリアルは、慎重に本当に必要な場合に限り使用してください。カラーの補正や調整、ブルーム、被写界深度や他の様々なエフェクトなどは可能な限り、Post Process ボリューム固有の設定を使用するようにしてください。この設定は最適化済であり、より効率的です。

ポストプロセス マテリアルの使用

ポストプロセス設定 (通常はポストプロセスボリュームまたはカメラ設定で定義) でいわゆるブレンド可能なアセットをブレンドすることができます。 現時点では、マテリアルマテリアルインスタンス のみがブレンドが可能なアセットです。アンリアル エンジンにはいくつかのポストプロセス マテリアルがありますが、 プログラマーの支援なしに独自の カスタム仕様のポストプロセス を作成することができます。

1 つ以上のポストプロセス マテリアルを [Blendables] セクションのポストプロセス ボリュームへ割り当てます。まず [+] キーを押して新スロットを追加し、 コンテンツ ブラウザ でマテリアルを選択して左矢印キーで割り当てます。順序はここでは重要ではなく、未使用のスロットは無視されます。

PostProcessSettings.png

簡単なポストプロセス マテリアルの作成

ゼロからポストプロセス マテリアルのエフェクト作成概要については、ポストプロセス マテリアルのサンプル をご覧ください。

FinalPostEffect.png

ポストプロセス マテリアルの重要な設定

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

DomainPostProcess.png

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

PostProcessMaterialProps.png

ブレンド可能な位置

説明

Before Tonemapping (トーンマッピングの前)

PostProcessInput0 は、HDR (ハイダイナミック レンジ) で最大限のライティングでシーンの色を提供します。 これを使用して Temporal AA や GBuffer ルックアップ (例、深度や法線) の問題を修正します。

After Tonemapping

色が LDR (ローダイナミック レンジ) 時の好ましい位置で、より低い精度と少ない帯域幅を必要とします。これはトーンマッピングとカラーグレーディングの後です。

Before Translucency

これはパイプライン内で 'Before Tonemapping' より早く、透過がシーンカラーと組み合わさる前になります。SeparateTranslucency (別々の透過) が、法線透過より後に合成されることに注意してください。

Replacing the Tonemapper

PostProcessInput0 は HDR シーンカラー、PostProcessInput1 は SeparateTranslucency (アルファはマスクです) を提供し、PostprocessInput2 には解像度の低いブルーム入力が付いています。

通常のポストプロセスの入力は、前のパスから入ってきます。PostProcessInput0 を使用する場合、 SceneTexture マテリアル式かから色にアクセスできます。SceneColor を使用した場合、適切な結果が得られないことがあります。

異なるマテリアル インスタンスのブレンド

ポストプロセス マテリアルの使用

ポストプロセス ボリュームでは、複数のポストプロセス マテリアル間で滑らかな遷移を簡単に設定することができます。ここでは「Unbound」にマークが付けられ、より大きなブレンド半径を持つボリュームを使用しています (例えば 1000)。

BlendingAVolume.png

BlendingAVolume1.png

Unbound に設定したポストプロセス

ボリュームを結合するポストプロセス

各ボリュームで同一マテリアルの異なるマテリアル インスタンスを指定します。色はこの 2 つのマテリアル インスタンスに対して違う設定ができるマテリアル パラメータとして指定されます。

BlendMatInst1.png

BlendMatInst2.png

赤のマテリアル インスタンス

緑のマテリアル インスタンス

Blend Radius が以下の範囲内の場合、カメラ位置に合わせてボリューム設定が使用されてブレンドされます。

Blend1.png

Blend2.png

Blend3.png

Unbound Post Process Volume Material Instance (RED) を 0.75 に設定

Blend Radius が 1000

Post Process Volume Material Instance (GREEN) を 0.75 に設定

カメラが移動すると、2 つのエフェクト設定間にスムーズな線形トランジションを認識することができます。

2 つのボリュームを持つレベルを上から見ると、以下のような図になります。境界をもたない大きなボリュームは赤のマテリアル インスタンス、小さなボリュームは緑のマテリアル インスタンスを持ち、ブレンド可能になっています。 小さい方のボリュームの優先度が高くなっています。マテリアルのパラメータはカメラ位置に応じてブレンドされます。 ぼやけたボーダーはボリュームによって指定される BlendRadius プロパティで定義され、ボリュームの形状を広げます。

正しくセットアップすると、すべてのブレンドは期待通りに行われます。

Bad Setup

Good Setup

この 2 つのセットアップの違いは、マテリアル (スカラーまたはベクター) のパラメータで指定するデフォルト値です。 良いセットアップでは、パスがエフェクトを持たない値になっています (例、ホワイトで乗算または 0 で線形補間)。

この 2 つのセットアップで以下がわかります。 カメラがいずれかのボリュームの影響範囲外にあるとポストプロセスのパスはレンダリングされません (グレイのグリッドで視覚化)。 いずれかのボリュームの影響範囲内にあると、正しいブレンドが表示されます。

悪いセットアップの場合 : カメラが影響がある半径に入ると、ぎこちない遷移が見えますが、デフォルト パラメータを誤って指定したからです。

良いセットアップの場合 : カメラが影響する半径に入ってくる遷移はうまく隠されていて、ボリュームの色が滑らかに遷移するのがわかります。

すべてのマテリアル インスタンスのプロパティは、プロパティのチェックボックスのチェック状況に関係なくブレンドされます (チェックが入っていなければ、親からのプロパティをブレンドします)。これはチェックされていないプロパティは何のエフェクトももたらさないポストプロセス設定とは異なります。 つまり、マテリアル インスタンスをブレンドすると、全てのプロパティがブレンドされます。

SceneTexture マテリアル式

SceneTexture マテリアル式をマテリアルに追加して、式プロパティで参照するテクスチャを選択します。

SceneTextureProps.png

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

SceneTextureExpression.png

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

DepthNextTo.png

このマテリアル式は、現ピクセルと隣接するピクセルとの深度の違いを計算します (例、In = 0,1 で、下のピクセルへデルタ値を返します)。

GBuffer プロパティの使用

GBuffer は、シェーディングの計算 (ライトとマテリアルの相互処理方法) にマテリアルを格納する複数のテクスチャ (例えばサブサーフェス / スペキュラカラー、ラフネスなど) や、 シェーディングを計算 (ライトがマテリアルとどのように相互作用するか) します。ディファード レンダラーでは、最初に GBuffer をレンダリングしてから GBuffer 属性と一緒に すべてのライティング (ディファード) を計算します。UE4 がディファード シェーディング パスを使用する場合 (例、DirectX 11またはハイエンドの OpenGL)、ポスト プロセス処理中にこれらのバッファへアクセスすることができます。

一般的にアンチエイリアス処理はこれを少々難しくします。GBuffer ピクセル/テクセルは出力ピクセルと 1:1 で関連付けられなくなったためです (以下のセクション参照)。

CustomDepth

この機能は、オブジェクトを別の深度バッファ (カスタム深度バッファと呼ばれます) でレンダリングすることによって、そのオブジェクトをマスクすることができます。 余分なドローコールが増えますが、マテリアルは追加しません。深度のみを出力するため、レンダリングは比較的低負荷です。この機能はメッシュで有効にすることができます (例えば、スタティックメッシュプロパティやレンダリングのカスタム深度):

CustomDepth.png

以下のシーンでは 2 つのオブジェクトでこの機能を有効にしていますが、コンテンツを視覚化するポストプロセス処理のパスはなく、以下のようにこの機能は不可視のままとなります。

scene.png

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

sceneCustomDepth.png

視覚化のために使用したマテリアルです。

CustomDepthMat.png

Temporal AA または GBuffer でなぜジッターが生じるか

Temporal AA は UE4 の特殊な機能で、わずかなパフォーマンス負荷で画像品質を大幅に向上させます。

デフォルト設定で、ポストプロセス マテリアルはポストプロセス グラフの最後に挿入されます (トーンマッパーの後)。つまり、トーンマッピング、カラー グレーディング、そして Temporal AA が適用された後に 最終的な LDR カラーを取得します。パフォーマンスや使いやすさの観点から、多くの簡易なポストプロセス エフェクトにとって最高の場所です。

以下は特定のオブジェクト周りのシルエットを可視化させるためにカスタムの深度入力値をどのように使用したかの例です。

sceneAfterTonemapper.png

この前の画像ではシルエットにアンチエイリアス処理が見受けられませんが、動作中はシルエットに 1 ピクセル程度のジッターがある (小刻みに揺らしている) のが分かります。 これは、Temporal AA では、シーン全体のレンダリングを各フレームでサブ ピクセル単位で動かすためです。アンチエイリアス処理がされた最終画像を作成するために、複数のフレームが一緒に結合されます。 この問題を解決するために、ポストプロセス グラフで前の場所へマテリアルを移動することもできます。

以下がその結果となります。

sceneBeforeTonemapper.png

安定したアンチエイリアス処理が施された画像となります。動作中は Temporal AA でいくつかのアーティファクトに気づくかもしれません。この機能は古い画像を置換するために深度バッファを使用しています。オブジェクトの内側でボーダーがレンダリングされた状態で問題なく機能しますが、 オブジェクトの外側では深度バッファを調整する必要があります (パフォーマンスの負荷が余分にかかるためまだ行っていません)。 これは理想的ではありません。

UV と ScreenPosition

画面にあわせたバッファでポストプロセス マテリアルをルックアップすることができますが、正しい UV が必要になります。 マッピング オプションを ViewportUV に設定した ScreenPosition マテリアル式は、ビューポートの左上 0,0 と右下 1,1 の UV を出力します。 対照的に、このマテリアル式で tSceneTextureUV マッピングを使うと、異なる結果となります。実際のテクスチャ (厳密にはレンダー ターゲット) は、ビューポートよりも大きくなる可能性があるためです。 このテクスチャは複数のビューポートで共有され、一番大きいものをすべてのビューポートで使用するので、エディタで使うには大きすぎる可能性があります。 ゲーム内でさえ、大きすぎる場合もあります (例、SceneCapture アクタは小さいビューポート、Matienee black borders、 Splitscreen、 VR など)。 SceneTextureUV オプションを使うと、大きいテクスチャ用の UV が提供されます。相対オフセット (ピクセルサイズのエッジ探知など) だけが必要な場合は、正しいサイズでスケールする必要があります。 SceneTexture マテリアル式には、サイズの出力とサイズの反転があります (ピクセル オフセットに効果的かつ便利です)。 全てをテストするには、様々なビューポート コンフィギュレーションをテストすることができるコンソール変数 r.ViewPortTest を使います。

フィルター済みテクスチャ ルックアップ

SceneTexture マテリアル式には、[bilinear (バイリニア)] でフィルター処理したルックアップを取得するためのチェックボックスがあります。このオプションを使うと、レンダリング速度が落ちるので、必要な場合のみ使用してください。 スクリーン空間テクスチャの多くはフィルター処理をサポートしていません (GBuffer など)。このプロパティを公開しないことで、エンジンが必要に応じてデータを圧縮できるようになります (パッキングがフィルタリングを妨げます)。

トーンマッパの置き換え

トーンマッパでブレンド可能な位置を置き換えることによって、エンジン トーンマッパを独自のものでオーバーライドすることができます。この機能は開発途中であり、今後変更される場合があります。また、機能はまだ完全に実装されていません。

ReplacingTheTonemapper.png

ポストプロセス設定パラメータをトーンマッパへ公開していますが、大幅な変更が予想されます。 値はマテリアル パラメータとして公開され、正確な名前が必要になります。

ベクター パラメータ:

Engine.FilmWhitePoint

スカラー パラメータ:

Engine.FilmSaturation
Engine.FilmContrast

パラメータを取得するには、ポストプロセス マテリアルからマテリアル インスタンスを作成する必要があります!

独自のパラメータを使って、他のポストプロセス マテリアルのようにブレンドすることも可能です。

既知の問題

以下は今後修正すべき問題です。

  • マテリアル式 SceneTexture

    • SeparateTranslucency (個別の透過) が機能しない。

    • 一部のルックアップが特定のパスで機能しない (例えば、パフォーマンスの負荷が高すぎるものは修正しない可能性もあります)。

    • MaterialFunction がエラーを報告しても PostProcess ドメインでマテリアルに使用される点

  • Material

    • PostProcessMaterial の UV が 0 から 1 の範囲ではない点 (例えばエディタでビューポートサイズを縮小時)。ルックアップと調整は取れるもののビネット エフェクトのようなものは実装が難しくなります。

    • ポストプロセス マテリアルのアセット サムネイルの見た目が正確ではない。

    • アルファ値の出力がいまだサポートされていない (オパシティを通過しなくてはいけません)。

    • マテリアル エディタのプレビュー マテリアルの見た目が正確ではない。

    • マテリアルの変化がポストプロセス処理の変化につながらない。回避策としてエディタを再起動します。

    • コンテンツ ブラウザ でポストプロセス マテリアルのフィルタリングを簡単にできるようにする。

  • ブレンド

    • ブレンド半径で 2 つのポストプロセス ボリュームをブレンド時の移行が滑らかではない。* デフォルト値であるマテリアルインスタンスを設定した境界をもたないボリュームを使用してこれを防ぎます。

FAQ

  • 入力値に "Lighting only mode (ライティングのみのモード)" のテクスチャを使用できますか?

    できません。中間段階でこのデータは有効ではありません。このビューモードではマテリアルカラーを無視してこれを 生成しています。高速オプションにするには大部分のレンダリング コードの再構築が必要です。

  • SceneColor のルックアップで表示されるバンディングは PostProcessInput0 の使用時に何故見えないのでしょうか?

    SceneColor 使用時は、現在書き込んでいるテクスチャへのルックアップが可能となるように質を低下させたシーンのコピーを作成します (一般的にはこの処理が不可能なメッシュへレンダリングしています)。 ポストプロセス処理では PostProcessInput0 を使用します。

  • ポストプロセス処理に必要なメモリ使用量はどの位ですか?

    メモリーの負荷はスクリーンの解像度次第です。トーンマッピング処理の前に HDR (ピクセルあたり 8 バイト)、その後 LDR (ピクセルあたり 4 バイト) を使用します。

  • ポストプロセスのレンダリング負荷を低くするには、どうしたらよいですか ?

    ターゲット プラットフォームで評価し、テクスチャ ルックアップ数を低めに維持、数学演算を少なくし、依存するテクスチャルックアップの削減、 ランダム化したテクスチャルックアップの回避を行います (テクスチャのキャッシュ ミスが原因で遅くなることがあります)。

  • パスはいくつ使用できますか?

    パスの使用ひとつひとつがパフォーマンス負荷に加算されます。パスを結合し、パスのアクティベートは必要時のみにとどめてください。一般的なゲーム機能、 例えばノイズを、パフォーマンスを高めるためにエンジンパスへ追加することが可能です。

  • ポストプロセス処理およびブレンドにかかる CPU のパフォーマンス負荷はどのくらいですか?

    マテリアルのブレンドはとても低負荷です。すべてのマテリアル インスタンスのプロパティは、ブレンドされ、こうした設定を持つひとつのポストプロセス マテリアルのパスだけがレンダリングされます。

  • 正確な TemporalAA を得るために "Before Tonemapper" を使用する必要があるのです。カラーを使用するとトーンマッピングされてしまい、違った見た目となってしまいます。この問題の回避方法は?

    この問題に対する簡単な解決法はありません。逆トーンマッピング演算 (高負荷) をする必要があります。明暗順応によって、 色の表示が異なる場合もあります。EyeAdaptation レベルを SceneTextures に公開して補正することができます。

  • ポストプロセス グラフのダンプ内容をすべて取得する方法は?

    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
    ...