【UE5】Visualizerを追加してみた

始まり

筆者さんは多少なりともエンジン改造慣れしているので、RenderDocで見ればいいじゃん、としか思わないのですが、5.3からなーんかSky系のLUTまわりがnullでRenderDocキャプチャするとクラッシュすることがあります。(2024/01/02時点。)

Epicさん描画まわりは結構やらかしているので今更気にならないですが。(ムカつきはする。)

開発機材がつよつよなのでクラッシュしても爆速再起動すりゃいいんですが、この機会にVisualizerを実装してみます。

Visualize: None
Visualize: Shading Models

エンジン改造のルールと前提の改造

Visualizerで可視化するリソースはシャドウマップをポストプロセスで扱えるようにしてみたで追加したリソースです。そのため、前提としてその改造が必要です。改造のルールもそこに記載してあるため併せて確認してください。

実装

適当に実装していきます。

Engine/Source/Runtime/Engine/Public/ShowFlagsValues.inl

シャドウマップの可視化変数VisualizeShadowProjectionを定義します。

githubで実装を見る

Engine/Source/Runtime/Engine/Public/ShowFlags.h

FEngineShowFlagsの初期化関数の対応をします。その他の有効、無効化関数も対応するべきですが、面倒なので省きます。

githubで実装を見る

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

PostProcessパス群にシャドウマップのVisualizerパスを追加します。

githubで実装を見る
githubで実装を見る
githubで実装を見る
githubで実装を見る
githubで実装を見る

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

Visualizerパスを生成するために必要な情報を格納するFVisualizeShadowProjectionInputsを定義しています。

githubで実装を見る

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

Visualizerパスやシェーダーまわりです。後述しますが初めて作成したVisualizer機能、あんまり面白くなかったので、シェーダーの読込やパス生成についての詳細は割愛します。そのうち少し昔のモンハンのポストプロセスなファーシェーダーとかも作る予定なので、その時に気分が乗ったら紹介しますね。気分屋さんの唯一の欠点、情緒というか火力というか興味がとても不安定。

githubで実装を見る

Engine/Shaders/Private/VisualizeShadowProjection.usf

シャドウマップのVisualizerシェーダーです。VertexShaderの実装がないですが、AddDrawScreenPass関数を使用する場合はデフォルトの頂点シェーダーが使用されるためです。UVAndScreenPosには、動的解像度やシーケンサ―でビューをした際の左右や上下の余白(黒い帯とか)を考慮したUVが格納されています。これ便利なんですよね。5.2とかだとモバイルレンダラーは呼び出せないとか制限があったような気がしますが、過去の話なのでうろ覚えです。(しかもクラッシュするのは実機だけね、Editorのモバイルプレビューだと表示できちゃうの。内部的にはDirectXで描画してるから。)

githubで実装を見る

動作確認

Visualize: Shadow Projection
Visualize: ShadowProjection

できたけど、なんか、面白くないな。

ある程度の実装量がないと興味の冷却速度が爆速ですね。お蔵になりそうだったので急いで書いたわ。

たしかにありゃ便利だけど保守コスト上げてまで作るほどのものじゃない気もしますね。使用頻度がアホほど高ければありかもですが。結論、RenderDocしか勝たん。

見て見て

Pythonでpaint.netを参考にブレンド&レイヤー機能付きのビューアーを作ったの。

そのうち記事にするの。たぶん。おそらく。気が乗れば。(コード行数が多いからちょっと面倒&怠い。)

左側の画像部分がpaint.netみたいなやつ

年末から年始にあったFANZA GAMESのセール祭りで約30本ぐらいゲームを仕入れた。
直近3年ぐらいゲーム買うだけ買って全部積んでるから、流石に遊びたい欲が一時的に爆発した。
その結果、めっちゃコード書いたわ。

。。。

素直に遊べばいいのにね。

偶に手を止めると、自分でもなんでコード書いているのか分からなくなるわ。

バカだから一晩も寝りゃまたコード書いてるんだけどね。