はじめに
こんにちは、クライアントエンジニアの下野です。
今回はUE5.6以降でピクセルデバックする際に対応必要だったのでメモです。
前提
エンジンのバージョンは5.6です。バージョンによってはコードが変わったりするので完全にコードを一致させても動かない場合があります。
Renderdocのバージョンはこの時点の最新バージョン、v1.41.1です。
Renderdocとは
シェーダーのデバックをするための外部ツールです。Unityでも使えます。
基本的な仕様とかは本題から外れるので、過去のブログを参照していただければです。
さて、UE5でピクセルデバックを行うためには、以下の手順を踏む必要があります。
UE5のフォルダ/Engine/Config/ConsoleVariables.ini内の以下の ; を削除します。
;r.Shaders.Optimize=0 ;r.Shaders.Symbols=1
UEを起動してプロジェクト設定を開き、プラグイン/RenderDocを選択してスタートアップ時に自動アタッチを有効にします。
RenderDocの保存先を変更した場合は実行ファイルパスの変更も忘れずに行ってください

エディターを再起動し、PIEで撮影したい場所に移動したのち、RenderDoc.CaptureFrameを入力したらRenderDocが開きます。

RenderDocで見たいパスのDrawCommandを選択し、レンダーターゲットのピクセルを選択した後、Debugを押したら完了です。

これでピクセルデバックが出来ます。
UE5.5以前では、この設定まででソースコードとアセンブリの両方が見れていました。
しかし、UE5.6以降ではアセンブリのみしか吐き出されず、ソースコードが見れません。

本題
上記でもアセンブリ読める人なら問題ないですが、わざわざ元のコードと照らし合わせるの面倒なので元ソースコード準拠で結果を見たいです。
そのための設定をしていきます。
最初にRenderdocを開いて、Tools/Settingsをクリックします。

次に、Coreの項目にあるShader debug search paths のChoose Pathsを選択します。

Browseを選択し、デバックしたいプロジェクトのProject/Saved/ShaderSymbolsを指定します。

これで起動したら無事ピクセルデバック出来るようになります。

原因とか
調べた範囲で原因とかを書いていきます。
原因を述べる前に軽く前提知識を話していきます。
UEのようにHLSLでシェーダーを書いてコンパイルする際は、DXILファイル(DirectX Intermediate Language)という中間言語に一旦変換されます。
これは特定のハードウェア限定の言語ではなく、全ハードの共通言語になるため異なるGPU間での互換性を高めるための物です。
これのおかげでHLSLコードが様々なプラットフォームで互換性のある挙動が担保出来ます。
これとは別に、RenderDoc等のデバックツールでデバックするためにはシェーダーのシンボルが必要になります。(r.Shaders.Symbols=1で出来る)
UBTでビルドしたらProject/Saved/ShaderSymbols のフォルダにPDBファイル(Program Base File)としてあります。デバック時に必要な変数名とか行番号とかの情報が入ってるやつです。
PCだとUE5.5まではPDBファイルのデバック情報にDXILファイルを紐づける感じでPDBファイル内に書いてありました。しかし、UE5.6からDXILファイルとPDBファイルが分離してShaderSymbols フォルダに格納されています。
これのせいでエディターだとピクセルデバックの際にフォルダの指定が必要になったっぽいです。
終わり
いかがでしたか?
不具合引いた時に値見れるのは便利なのでこれからもRenderDocにはお世話になると思いますがプロジェクト変わったタイミングとかでこの設定を忘れないようにしたいです。
流石に面倒なのでそのうち対応入ると思いますが、プロジェクトの関係で古いバージョン使う際などは気にしてあげて下さい。