【UE5】SMAAを組み込んでみた - Unreal Engine 5.4

作業環境

始まり

Unreal Engine 5.4 にSMAAを組み込んでいきます。

Unreal Engine 5.2で組み込んだSMAA

Subpixel Morphological Anti-Aliasing (SMAA)

そのうち書く。

Edge Detection Pass

そのうち書く。

Blend Weighting Pass

そのうち書く。

Neighborhood Blending

そのうち書く。

動作確認

そのうち書く。

動作確認(ディザ越し)

TSR FXAA SMAA None

TSRは様式美のようなゴースティングで、FXAAはバイリニアなため前景オブジェクト(黒色)と混ざって見た目が暗いですね。SMAAはエッジ検出のお陰で前景オブジェクト(黒色)と混ざり過ぎず、色が比較的担保されていますね。気になる点としては、SMAAとNoneの違いがぱっと見分からないというぐらいでしょうか。

SMAA None
SMAA None

ぱっと見だとSMAAとNoneの違いが分からなかったのですが、拡大して見ると補間はされているみたいですね。

実装

紹介順はコミット履歴に準拠しているので順不同です。
※時系列に沿うのは結構面倒というのも理由。

Engine/Config/BaseEngine.ini

エッジの真偽判定で使用するAreaとSearchテクスチャのアセットパスを指定しています。

githubで実装を見る(L172-L173)

Engine/Content/EngineResources/AreaTexture.uasset

]

テクスチャフォーマットはR8G8とR8ではなく、より圧縮率の高いBC5BC4を選択しています。
圧縮したからといって目に見えるほどの品質劣化・差分はありません。

Non-perceptible quality decrease, marginal performance increase

Engine/Content/EngineResources/SearchTexture.uasset


Engine/Shaders/Private/SMAA/SMAABlendingWeightCalculation.usf

githubで実装を見る

Engine/Shaders/Private/SMAA/SMAACommon.ush

githubで実装を見る

Engine/Shaders/Private/SMAA/SMAAEdgeDetection.usf

githubで実装を見る

Engine/Shaders/Private/SMAA/SMAANeighborhoodBlending.usf

githubで実装を見る

Engine/Source/Editor/HardwareTargeting/Private/HardwareTargetingModule.cpp

ブレークポイントを張っても到達しなかったので、どこで呼ばれているのかいまいち分からない関数です。

githubで実装を見る(L134-L135)

Engine/Source/Runtime/Engine/Classes/Engine/Engine.h

AreaとSearchテクスチャのパスとリソースの所有者です。

githubで実装を見る(L1423-L1437)

Engine/Source/Runtime/Engine/Classes/Engine/Scene.h

SMAAをカスタム品質(r.SMAA.Quality 4)にした場合に採用される各パラメータはポストプロセスボリュームで設定するようにしています。

CVarで簡易的な整備でもいいですが、カメラ・ビューごとに設定を変えたい場合やシーケンサーからパラメータ調整したい場合には、ポストプロセスボリュームで用意してあげた方が汎用性が高いです。

githubで実装を見る(L1185-L1195)
githubで実装を見る(L2302-L2316)

Engine/Source/Runtime/Engine/Private/Scene.cpp

ポストプロセスボリュームで設定するSMAAパラメータの初期値です。

githubで実装を見る(L652-L655)

Engine/Source/Runtime/Engine/Private/SceneUtils.cpp

PCプラットフォーム以外でSMAAが選択された場合に、強制的にアンチエイリアスなし状態にしています。

githubで実装を見る(L137-L144)


Scalabilityの表示名の対応です。対応を忘れるとensureで落とされます。

githubで実装を見る(L177-L180)

Engine/Source/Runtime/Engine/Private/SceneView.cpp

コンソール変数のr.AntiAliasingMethodにSMAAを追加しています。

githubで実装を見る(L222-L227)


ポストプロセスパラメータの上書き対応です。
SMAAパラメータは線形補間せずにSETしています。

githubで実装を見る(L1899-L1902)

Engine/Source/Runtime/Engine/Private/UnrealEngine.cpp

UnrealEngine起動時にAreaとSearchアセットを読み込んでいます。
不正なアセットパスやアセットが壊れている場合にはLoad関数でエラーが吐かれます。読込まわりは例外処理が組まれていないので、エラーが解消されるまでは永遠とエンジンが起動できなくなります。

githubで実装を見る(L3189-L3190)

Engine/Source/Runtime/Engine/Public/SceneUtils.h

アンチエリアスの種類にSMAAを追加しています。

githubで実装を見る(L57)

Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessSMAA.cpp

githubで実装を見る

Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessSMAA.h

githubで実装を見る

Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp

SMAAパスの挿入位置は5.2と異なり、TAAと同様に被写界深度より前に変更しました。

Unityを参考

githubで実装を見る(L76)
githubで実装を見る(L782-L790)

おわり!!!

次回はSMAA Reprojection (T2x)とComputeShader対応をして簡易的な負荷検証をしてみたいですね。

雑談

実装コメントの日付を見るとGWです。
なにを隠そう実装はGWに終わっていたのです。

なーのーでーすーがー。

筆が進まなかったのです。

メモ帳には要素ごとに書きたいことをチマチマ纏められる程度に順調だったのですが、いざ、はてなブログの編集画面を開くと不思議と冷めてしまいました。

大変困った筆者さんは、とりあえず公開するという暴挙に出ました。

リポジトリが存在する以上は文章はおまけです。一旦はこれで良しとします。

SMAAは5月に片づけたいことリスト最上位で且つ最後の項目なので、どんな手を使ってでも消化したかったのです。

という訳で未来の筆者さん。気が乗ったら、追記よろしく。

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


表示する

5月22日

ぱっと見、姉妹作品に見えなくもないタイトルです。

シナリオさんと声優さんの並び的にも尚更姉妹作品感を強く感じます。
作品の世界観がどえらい違うので、区別はできそうですけど。

ちなみに筆者のユーザーIDの末尾番号は湊くんの誕生日を5月11日と誤記憶していたことが由来です。

数年間も勘違いし続けていたので、最早ひとつの思い出です。

SNSをやっていない唯一のデメリットが、こういう情報更新頻度がバカ低いことですね。

ネットサーフィンすればいい話ですが、これ以上興味のある分野を見つけてしまったら困るので。


とりあえず、予約しました。
ポイント還元期間と重なったのでちょっとお得な気分です。

やらかした点としては、予約はパッケージ版で買うと決めていたのですが、注文履歴を見返したらダウンロード版を買っていました。ソフマップでも頼もうかなぁ。悩ましい。

20%ポイント還元


それはさておき。

セレオブをきっかけに今年からはゲームを再開しようかなと思い始めて早々にClover Memory'sとオトメセカイ、惹かれるラインナップが多いです。

タイミングがいいのやら、悪いのやら。

略し方『オトメき』なのか。。。変換怠いな。辞書登録すればいいか。

喫茶(かふぇ)も当て字だしな。


ゲームを再開したい欲もありつつ、コードを書き続けないとベテランに追い付けない現実。
投資している年月に差があるのですぐに追いつけないのは当然ですが、それを堂々と理由にするのは、なんか癪なの。

両立できれば理想ですが、所詮は理想。
現実世界には物語の進捗度に関係なく刻まれ過ぎ行く時間という仕様があるから難しい。

セーブポイントでもありゃいいんだけどねぇ。

ふふ。

どうやって楽しく過ごすかという悩みは辛いけど、なんやかんや最終的には楽しいですね。

そんなわけで湊くんの誕生日でした。(ケーキもぐもぐ。)