ひよっこ創作ブログ@Rwi

UE4(+ゲーム制作関連)で何やら書いていきます

【UE4】ポストプロセスマテリアルの基本を押さえよう!

f:id:rwiiug:20200627111339j:plain  f:id:rwiiug:20200627111418j:plain
ポストプロセスによる画面効果を自作できる「ポストプロセスマテリアル」。
その基本的な実装方法を自学を兼ねまとめてみました。

作例などは通常のマテリアル制作にも応用できるかも?


目次

  1. ポストプロセスの表示準備

  2. ポストプロセスマテリアル ~ 基本

  3. ポストプロセスマテリアル ~ 応用
     3-1. 効果範囲をマスク
     3-2. 効果具合を調節
     3-3. パラメータを動的に変化させる

  4. ポストプロセスマテリアル ~ 作例
     4-1. 画面をモノクロ化
     4-2. 色反転
     4-3. Photoshop的レイヤー効果
     4-4. ノイズ表示
     4-5. マスク効果で画面フチ演出
     4-6. 画面ズーム演出

  5. 参考



ポストプロセスの表示準備

f:id:rwiiug:20200619135501p:plain

適当なブループリント(ここではActor)を作成 & ワールドに配置し、
コンポーネントを追加」からPost Processコンポーネントを追加。



f:id:rwiiug:20200620055531p:plain
f:id:rwiiug:20200620055538p:plain

作成したポストプロセスマテリアルはPost Processコンポーネント → 詳細タブ内の
「ポストプロセスセッティング → Array」または「ポストプロセスボリューム → Rendering Features → Post Process Materials → Array」にセットして使用。








ポストプロセスマテリアル ~ 基本

f:id:rwiiug:20200626132743p:plain
f:id:rwiiug:20200626162712j:plain
始めに新規マテリアルを作成。
詳細タブ → 「Material Domain」 を「Post Process」に。


f:id:rwiiug:20200626162800j:plain
何もノードを接続していない現時点では、ただ「画面に"無"を表示するポストプロセス」。


f:id:rwiiug:20200626162859j:plain
次に、グラフ上に「SceneTexture」ノードを配置。
詳細タブから 「Scene Texture Id」を「PostProcessInput0」に。


f:id:rwiiug:20200626162931j:plain
すると「元の表示画面をそのまま画面に表示するポストプロセス」に!


f:id:rwiiug:20200626163051j:plain
f:id:rwiiug:20200626163211j:plain
ここで「ComponentMask」ノードで元画面のRGB要素を分解し、
「MakeFloat3」ノードで分解した要素を再び合成してみる。
現時点では結果は先ほどと変わらないものの・・・


f:id:rwiiug:20200626163332j:plain
f:id:rwiiug:20200626163333j:plain
「Multiply」ノードでR要素の値を2倍にしてみると、画面が赤っぽく!
これで「画面全体が赤っぽくなるポストプロセス」の完成!👍

あとは通常のマテリアル作成と同様、ノードをこねくり回して画面効果を作っていきます。








ポストプロセスマテリアル ~ 応用

効果範囲をマスク

f:id:rwiiug:20200626141815j:plain
f:id:rwiiug:20200626145643j:plain
f:id:rwiiug:20200626145849j:plain
ポストプロセスを画面の一部分だけに適用させたい場合はこのようなマスク処理で。

白黒の「マスク用テクスチャ」を元に、白い箇所は元画面を表示し、黒い箇所は加工画面を表示。最後に2つの画面情報をAddノードで合成することでマスク効果のできあがり。


f:id:rwiiug:20200626161051j:plain
マスクテクスチャ次第でオシャレな効果も?




効果具合を調節

f:id:rwiiug:20200625210848p:plain
f:id:rwiiug:20200625210658p:plain
「Lerp」ノードで2つのデータ(元画面と加工画面)の割合を調節。

パラメータ「Alpha」に与える値が
 0.0の場合、元画面のみに
 0.5の場合、元画面と加工画面が半々に
 1.0の場合、加工画面のみに


f:id:rwiiug:20200625210116g:plain
マテリアルからマテリアルインスタンスを作成。
パラメータの値をぐりぐり変更して確認できるように。


f:id:rwiiug:20200626143137j:plain
副次的なおまけ機能として、
パラメータ「Alpha」の値が「0.0未満」または「1.0より大きい」と出力結果が極端な見た目に。





パラメータを動的に変化させる

ポストプロセスマテリアル内のパラメータをBP等から動的に変化させたい場合、
通常のマテリアルとは違い、事前に一工夫が必要!

パラメータマテリアルコレクションという機能を活用する必要があります。

[参考]
Material Parameter Collections | Unreal Engine Documentation
複数のマテリアルに共通の設定値を用意するには - ### 開発めも


f:id:rwiiug:20200626155812j:plain
f:id:rwiiug:20200626162339j:plain
「マテリアルパラメータコレクション」アセットを新規作成し、パラメータを作成。


f:id:rwiiug:20200626160032j:plain
通常のパラメータノードの代わりに「Collection Parameter」ノードを接続し、
詳細タブから使いたい Collection と Parameter Name を設定。

1つのマテリアル内から参照できるCollectionは最大2つまでという仕様があるため注意!(3つ以上参照した場合はエラーが発生)


f:id:rwiiug:20200626162545j:plain
f:id:rwiiug:20200626162505j:plain
あとはBPから「Set Scalar Parameter Value」ノードを用いて、「TimeLine」ノード等でマテリアルパラメータコレクション内のパラメータを変化させると・・・


f:id:rwiiug:20200625214335g:plain
「ポストプロセス内のパラメータをBPで動的に変化させる処理」の完成!👍








ポストプロセスマテリアル ~ 作例

・画面をモノクロ化

f:id:rwiiug:20200626172540j:plain
f:id:rwiiug:20200626172535j:plain

RGB要素それぞれを「BT.601」形式で重み付けして計算。
V = 0.299×R + 0.587×G + 0.114×B

[参考]
グレースケール画像のうんちく - Qiita




・色反転

f:id:rwiiug:20200626175939j:plain
f:id:rwiiug:20200626175946j:plain


f:id:rwiiug:20200626180025j:plain
「OneMinus(1-x)」ノードでRGB要素それぞれの値を反転。




Photoshop的レイヤー効果

https://blueprintue.com/blueprint/ma9pm35a/
範囲選択 → 「Ctrl + c」「Ctrl + v」  または リンク先の「Code to Copy」でUE4内にコピペできます


f:id:rwiiug:20200626212716j:plain
UE4標準のBlendノードでレイヤー効果をお手軽に反映できる。




・ノイズ表示

「Custom」ノードを用いてノイズを発生させるポストプロセスマテリアル。
通常のマテリアルとして利用しても便利かも?

https://blueprintue.com/blueprint/4utlx1cg/

  

[参考]
「画面全体にノイズを出力するポストプロセス」
https://qiita.com/dgtanaka/items/13e643fafeb007961601




・マスク効果で画面フチ演出

https://blueprintue.com/blueprint/_m1tqhvq/




・画面ズーム演出

https://blueprintue.com/blueprint/_-xfkijs/

f:id:rwiiug:20200626182509j:plain
f:id:rwiiug:20200626182513j:plain
画面外の表示が気になる場合、上記の「マスク効果で画面フチ演出」ポストプロセスと組み合わせると違和感をある程度軽減できます。(「ズーム演出」の前に「フチ演出」を先に実行)

f:id:rwiiug:20200627110118j:plain
ポストプロセスコンポーネントを2つ用意し、「Priority」の値で実行順を制御。




平行投影カメラの場合、カメラ設定でOrtho Widthの値を変化させても同じようなズーム効果を得られますが、MipMap等の処理関係でグラフィックには差異が生まれます。
「ドット絵感」の好みに合わせてご選択を。

f:id:rwiiug:20200626213506p:plain
Ortho Width:640 → 64

f:id:rwiiug:20200626213547p:plain
ポストプロセス:ズーム率10倍



[参考]
【UE4】ポストプロセスマテリアルで画面をいろいろいじる-前編 【★★】 | キンアジのブログ








参考

【マテリアル】
Math 式 | Unreal Engine Documentation
ブレンド | Unreal Engine Documentation
もんしょの巣穴blog [UE4] マテリアルノードの解説 その1
UnrealEngine4マテリアルレシピ - kurosaurus - BOOTH
UE4でHLSLをはじめよう!-基礎の基礎編- - POKOTARO屋 - BOOTH

【ポストプロセス】
・ドット絵風モザイク https://youtu.be/tJTdgoXZWcM?t=4757
【UE4】お手軽白黒ドット表現 【★☆】 | キンアジのブログ
【UE4】ポストプロセスマテリアルで画面をいろいろいじる-前編 【★★】 | キンアジのブログ
【UE4】いろんな画面のゆがみ【★★】 | キンアジのブログ
UE4.20.3でブラウン管ポストエフェクトを作るの巻 - 🌥制作記録🌥
UE4でRGBずらしPostProcessMaterialを作る - 🌥制作記録🌥

【マテリアルパラメータコレクション】
Material Parameter Collections | Unreal Engine Documentation
複数のマテリアルに共通の設定値を用意するには - ### 開発めも


関連記事:
rwiiug.hatenablog.com rwiiug.hatenablog.com