【UE5】ポストプロセスマテリアルの変更点(UE5.3 から UE5.4)について - Unreal Engine 5.4

作業環境

注意点

本記事は Unreal Engine 5.4 がリリースされる前の作業用ブランチで調査した内容 4/21 (日) です。
※正式リリースとは異なる情報が含まれる可能性があります。

始まり

そろそろ Unreal Engine 5.4 のリリースが近いかなと思い、渋々エンジンコードを流し見していたら、(自称)描画エンジニア的に、気に留めるべきであろう変更点が見つかりました。

そう、ポストプロセスマテリアルのレンダープライオリティを制御する Blendable Location が大幅に変更されていたのです。


UE5.3の時には以下のようなコメントがあったので『いつか追加したい思惑はあるんやろな』と思っていました。

//	BL_AfterOpaque,
//	BL_AfterFog,
//	BL_AfterTranslucency,
//	BL_AfterPostProcessAA,

ついにその時が来たようです。


。。。


はぁ。。。


さて、確認していきましょうか。。。


(エンジンアップデートがクソ怠いレベルの変更点なのですよ。。。(泣)

Unreal Engine 5.4 ビルドエラー


LNK2001 外部シンボル "wchar_t * GInternalProjectName" (?GInternalProjectName@@3PA_WA) は未解決です
LNK2001 外部シンボル "wchar_t const * const GForeignEngineDir" (?GForeignEngineDir@@3PEB_WEB) は未解決です

UE開発に慣れている方々にはお馴染み Visual Studio のバージョンに起因したビルドエラーです。

最初にソリューションをビルドして、全てのエラーを吐きだせば Visual Studio『ソリューション次第では、完全な開発エクスペリエンスを得るために、さらにコンポーネントをインストール必要があります。』と不足しているコンポーネントを教えてくれるので、その案内に従ってインストールしましょう。

少なくとも筆者の環境では MSVC v143 - VS 2022 C++ x64/x86 ビルド ツール (v14.38-17.58) をインストールした後に再度ソリューションビルド(※Not Rebuild)して解消しました。

ですが、ビルドエラーは完全に環境依存です。
場合によっては解決しないこともあるので、まぁ、頑張ってください。

ちなみに改善されていなければ Unreal Engine を初手からリビルドするとエラーを吐きます。確かリビルドの過程でファイルのコピー処理があるのですが、初手からやるとコピー対象がないので、それでエラーに陥るだったような気がします。

Unreal Engine 5.3 までの Blendable Location

COするとなかのひとは同じです。リポジトリが結び付いているから辿れば分かるでしょ。)

言葉遣いに揺れがあるのはTPOの関係です。

こっちは個人なので独壇場なのです。


色々と自由に活動させてくれる良き会社です。
興味があったら是非、基本的には通年で採用はバチバチにしているはずです。
特に描画まわりに強い方チャレンジしたい方には、居心地のいい環境が整えられていると思います。
まぁ筆者は新卒から居るので、単に周りを知らねぇだけかも。参考程度に。

全体的に変わったこと

Blendable Location の名称が明確になりました。

UE5.3までは名称に対して実挙動にコレジャナイ感がありました。
※主観だから異論は認める。

描画パス順の可視化(使用するアンチエイリアスの種類によって挿入位置が多少異なります。)
名称 実挙動
Before Translucency 厳密には Translucency (AfterDOF) の前に描画されるポストエフェクトパス。UEが半透明の規格を複数(BeforeDOF, AfterDOF, AfterMotionBlur)用意しているくせに名称を使い分けていない。
Before Tonemapping 位置がトーンマッパのBefore過ぎる点に関しては若干文句あるが、概ね間違いではない。
SSR Input ScreenSpaceRayTracing の SceneColor (PrevSceneColor) に適用されるポストエフェクトパスだが、筆者は使ったことないので特に言及することがない。
Replalcing the Tonemapper その名の通りトーンマッパの置換パスで文句はない。
After Tonemapping その名の通りトーンマッパの後に適用されるポストパスなので文句はない。


UE5.4ではこの問題が改善され、描画パス順から見たらかなり正しい名称に変わりました。

描画パス順の可視化(使用するアンチエイリアスの種類によって挿入位置が多少異なります。)
描画パス順の可視化(Replacing the Tonemapperを有効化するとBloomが無効になるので別画像として用意。TonemapPassがBloomのCompositePassも兼ねているのが原因。)
名称 実挙動
Scene Color Before DOF 被写界深度(DOF)の前に適用されるポストパス
Scene Color After DOF 被写界深度の後に適用されるポストパス
Translucency After DOF Translucency (AfterDOF) を書き込んだバッファに対して適用されるポストパス
SSR Input ScreenSpaceRayTracing の SceneColor (PrevSceneColor) に適用されるポストパス
Scene Color Before Bloom ブルーム(Bloom)の前に適用されるポストパス
Replacing the Tonemapper トーンマッパ(Tonemapper)の置換パス
Scene Color After Tonemapping トーンマッパの後に適用されるポストパス

Scene Color Before Bloom だけは Bloom の PrePass が多いので少し悩ましいですが妥協点ってところですかね。

個人的には Translucency After DOF の登場が熱いです。

懸念点としてはバリエーションが増加したことで適当に使う輩が少なからずおるやろなぁというところですかね。。。

検証用のサンプル

動作確認用に配置しているマテリアルの情報です。


Scene Color Before DOF

被写界深度の前に適用されるポストパスです。
UE5.3までの Before Translucency と同等のパスです。

アウトライン(左が被写界深度なし、右が被写界深度あり)
グレースケール(左が被写界深度なし、右が被写界深度あり)

Scene Color After DOF

被写界深度の後に適用されるポストパスです。
UE5.3までの Before Tonemapping と同等のパスです。

被写界深度を適用した後に描かれるため輪郭線が浮き出ていますね。

アウトライン(左が被写界深度なし、右が被写界深度あり)
グレースケール(左が被写界深度なし、右が被写界深度あり)

半透明の種類について

Translucency After DOF を説明するためには Unreal Engine の半透明の種類を把握しておく必要があるので軽く触れます。

Unreal Engine には半透明が3種類あります。

  • Before DOF
  • After DOF (Default)
  • After Motion Blur

読んで字の如くで上から順に被写界深度前の前にSceneColorに書き込まれる半透明 (Before DOF) そして被写界深度の後にSceneColorに書き込まれる半透明 (After DOF) 最後にモーションブラーの後に描きこまれる半透明 (After Motion Blur) の3種類です。

半透明のパス順

After DOF と After Motion Blur はテンポラルテクスチャに書き込んでポストプロセスパス群の指定の位置で合成されます。合成位置は被写界深度やモーションブラーの使用有無、使用するアンチエリアスによって結構変わるので参考程度にしてください。

After DOF を選択しているのに被写界深度が適用される問題

この現象は不具合ではなく Unreal Engine 5.2 から導入された実験的な描画仕様です。

一定の距離を離れたら After DOF を選択していても Before DOF と同様に被写界深度が適用されるような設計になっています。

どの程度離れたら被写界深度が適用されるかは DepthOfFieldFocalDistancer.Translucency.AutoBeforeDOF を元に算出されます。

r.Translucency.AutoBeforeDOF
※DepthOfFieldFocalDistanceは32.0
動画
0.5 (Default)
0.9
0.95
-1.0


r.Translucency.AutoBeforeDOF を -1.0 にすると実験的機能が無効化され、常時被写界深度が適用されなくなります。

なお5.4でも実験的(Experimental)な立ち位置らしいです。
いい加減に正式実装するか廃止するか決めてくれませんかね。

せめて実験的機能ならデフォルトでは動作しないようなパラメータを初期値にしてほしいです。

半透明マテリアルはアーティストも触るから下手に仕様変更されると困惑されるんですよね。

エンジニア相手なら『Release Notesと実装を読め』で一蹴できますが、アーティストに対しても同様の対応を取ったら流石にねぇ、不親切だし。つまりEPICが上手くケアしろという文句。

Translucency After DOF

Translucency.AfterDOF に適用されるポストパスです。

先ほどの Scene Color Before DOF と Scene Color After DOF は SceneColor に対して書き込みをするポストパスでしたが、Translucency After DOF は Translucency.AfterDOF に対して書き込みをするポストパスです。

こうやって並べて見ると命名が理に適っていて良いですね。

試しに緑色に変えてみる
ノードの組み方も簡単

SceneTexture: PostProcessInput1 を選択することで Translucency.AfterDOF の情報を取得できます。

説明不要とは思いますが透明度を OneMinus しているのは半透明の仕様です。

Translucency.AfterDOF の透明度(Alpha)は、1.0だと完全に透明で見えない状態を指しており、0.5だと半分透明で可視出来る状態0.0だと半透明(不透明)な状態を指しています。

この辺りは実際にRenderDocでピクセル情報を見た方が解りやすいと思います。

ついでに書き込みも覗いてみましょうか。
画像を見りゃ分かると思うので説明はクソ雑です。

説明 画像
PostProcessInput1 (Translucency.AfterDOF)
新しい Translucency.AfterDOF バッファ名は PostProcessMaterial
AfterDOF の CompositePass の入力に SceneColor と PostProcessMaterial (Translucency.AfterDOF) がセットされる
SceneColor に PostProcessMaterial (Translucency.AfterDOF) を合成

SSR Input

ScreenSpaceRayTracing の SceneColor (PrevSceneColor) に適用されるポストパスです。
RayTracing を使う機会がないので割愛します。

実装が気になる方は CustomSSRInput で検索してみてください。

SSR Input の出力結果を CustomSSRInput として保存して、次フレームの時に保存した CustomSSRInput を PrevSceneColor として利用している感じです。

Scene Color Before Bloom

ブルームの前に適用されるポストパスです。

不透明&半透明の両方に適用したいポスト効果を作るのに適しているかもしれません。

TAA or TSR or スクリーンパーセンテージ (Screen Percentage) を使用している場合は注意が必要

SceneColorBeforeBloom は TAA / TSR の後に挿入される

TAA / TSR の後に挿入されるためアンチエリアスや超解像度が適用されません。

尚且つスクリーンパーセンテージの後に適用されるパスのため、計算コストがビューポートサイズと合致、要は計算コストが100%掛かります。

Scene Color After DOF Scene Color Before Bloom
Screen Percentage 100%
Screen Percentage 50%

静止画なので伝わりませんが TAA / TSR の後なので Jitter Offsets を考慮しないとめっちゃブレます。

大前提としてこのパスで輪郭線を描くことが間違いなので、その点は気にしないことにします。

名称的に不透明と半透明の両方に適用できるポストパスだと思ったのですが TAA / TSR の場合は例外みたいですね。

最初は滅茶苦茶不満でしたが TAA / TSR の描画仕様を考えたら多少受け入れられました。

というのも TAA / TSR は AfterDOF の Composite Pass を内包しているので、ポストパスの挿入を考えるとクソ怠い設計になってしまうのですよね。

理屈は分かるのですが。

う~ん。。。

うん。。。

こういうところが Unreal Engine 嫌い。
Translucency After DOF の実装は嬉しいから嫌い度は相殺ですね。

Replacing the Tonemapper

トーンマッパの置換パスです。

注意点としてブルームの結果はトーンマッパパスで合成されるため Replacing the Tonemapper を使用するとブルームが適用されなくなります。

Scene Color After Tonemapping

トーンマッパの後に適用されるポストパスです。

飽きた。

おわり!!!

後半から飽きたのでざっくりになりましたが、変更内容の概要は確認できました。

詳細は個人の5.3プロジェクトを5.4アップデートする時にWinMergeと睨めっこするだけですね。

Release Notesを読むのは大前提ですが、結局のところは実装を見た方が手っ取り早い気がします。

雑談

【UE5】XXX - Unreal Engine 5.4

記事タイトルの新しい形式、思い付きですが結構いいですね。

お気に入りになりました。


5.4の正式リリース後に公開する予定でしたが、待ちきれなくなったので放出です。


UDNの料金がバカ高くなりますね。

まぁ筆者はエンジンコード見れば聞く必要ないだろという脳筋スタイルで、自発的に使ったことはないので、ぶっちゃけどうでもよかったり。

というか実装から汲み取れたり、リポジトリに載ってるような当たり前の情報しか返してこない気がするんですよね。

あの程度ならGPTで学習させれば同程度の返答は期待できそうな気がします。

。。。

あー。それ面白いな。


最近DistilBERTからGPT-2に乗り換えようか迷っていて、検証の準備を進めている筆者さんです。

とはいえTransformerは精度が学習データ量に比例する特性があるので、高性能な言語モデルを選択しても、個人開発環境だと真価を発揮できない可能性もあったりで、色々と悩ましいです。

テキストとキャッシュがアホほど要領を食う

クラウドGPUは使い方を覚えるのが怠いので最終手段です。

冬場も過ぎたのでGPU排熱の灼熱地獄が近づいています。


ここから先は(たぶん)年齢制限のかかっている作品を取り扱うページとなります。


表示する

埋め込みコードというものを使ってみたかったの。

残り期間が約1か月ほどあるというのに、ほぼほぼ達成しそうな雰囲気で草ですわ。

給料日前だというのに凄い勢いですわ。

ちなみに開封用(前回)と保存用(今回)をポチッしました。

  • ALcotメモリアルグッズオンリープラン x2
  • グッズプラン x1
  • グッズアッパープラン x1

皆さんも趣味にお金をいっぱい使いましょ。

幸福感◎です。

そのためにお仕事しているですから。

目的と手段ですね。