- 作業環境
- 始まり
- リポジトリ
- エンジン改造のルールと前提の改造
- 実装
- Engine/Source/Runtime/Engine/Public/ShowFlagsValues.inl
- Engine/Source/Runtime/Engine/Public/ShowFlags.h
- Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp
- Engine/Source/Runtime/Renderer/Private/PostProcess/VisualizeShadowProjection.h
- Engine/Source/Runtime/Renderer/Private/PostProcess/VisualizeShadowProjection.cpp
- Engine/Shaders/Private/VisualizeShadowProjection.usf
- 動作確認
- 見て見て
作業環境
- 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
を定義します。
Engine/Source/Runtime/Engine/Public/ShowFlags.h
FEngineShowFlags
の初期化関数の対応をします。その他の有効、無効化関数も対応するべきですが、面倒なので省きます。
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
を定義しています。
Engine/Source/Runtime/Renderer/Private/PostProcess/VisualizeShadowProjection.cpp
Visualizerパスやシェーダーまわりです。後述しますが初めて作成したVisualizer機能、あんまり面白くなかったので、シェーダーの読込やパス生成についての詳細は割愛します。そのうち少し昔のモンハンのポストプロセスなファーシェーダーとかも作る予定なので、その時に気分が乗ったら紹介しますね。気分屋さんの唯一の欠点、情緒というか火力というか興味がとても不安定。
Engine/Shaders/Private/VisualizeShadowProjection.usf
シャドウマップのVisualizerシェーダーです。VertexShaderの実装がないですが、AddDrawScreenPass
関数を使用する場合はデフォルトの頂点シェーダーが使用されるためです。UVAndScreenPos
には、動的解像度やシーケンサ―でビューをした際の左右や上下の余白(黒い帯とか)を考慮したUVが格納されています。これ便利なんですよね。5.2とかだとモバイルレンダラーは呼び出せないとか制限があったような気がしますが、過去の話なのでうろ覚えです。(しかもクラッシュするのは実機だけね、Editorのモバイルプレビューだと表示できちゃうの。内部的にはDirectXで描画してるから。)
動作確認
できたけど、なんか、面白くないな。
ある程度の実装量がないと興味の冷却速度が爆速ですね。お蔵になりそうだったので急いで書いたわ。
たしかにありゃ便利だけど保守コスト上げてまで作るほどのものじゃない気もしますね。使用頻度がアホほど高ければありかもですが。結論、RenderDocしか勝たん。