【UE5】Visualizerを追加してみた

Unreal Engine

水ノ茉の宣伝

叡智でえっちな同人作品を予定中…

Ci-en R18

作業環境

  • Windows 10
  • Visual Studio 2022
  • Visual Studio Code
  • Unreal Engine 5.3

始まり

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

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

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

リポジトリ

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

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

実装

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

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

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

githubで実装を見る(L445-L448)

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

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

githubで実装を見る(L493-L495)

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

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

githubで実装を見る(L73-L75)
githubで実装を見る(L394-L396)
githubで実装を見る(L448-L455)
githubで実装を見る(L504-L506)
githubで実装を見る(L1643-L1655)

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

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

githubで実装を見る(L1-L28)

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

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

githubで実装を見る(L1-L76)

Engine/Shaders/Private/VisualizeShadowProjection.usf

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

githubで実装を見る(L1-L19)

動作確認

Visualize: ShadowProjection

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

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

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

見て見て

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

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

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

。。。

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

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

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