UEでPIXを利用してシェーダデバッグ

## はじめに

レンダリングのプロファイルツールは皆さんご存じのRenderDocを利用することが多いと思います。
ただ、UE5のRHIのデフォルトがDirectX 12になったことでシェーダデバッグができなくなりました。
自分の知らない解決策があるかもですが。。。知ってる人がいたら教えてください。

この記事ではkafues511さんの記事「[【UE5】PIXでピクセルデバッグ – Unreal Engine 5.4](https://kafues511.jp/2024/11/30/1754/)」を参考にPIXでシェーダデバッグできるようになるまで手順を記載します。

## 環境
Windows 11 Pro
UE 5.5.0
PIX 2409.23

## PIXとは？
勉強中です。。。公式に譲ります。

https://devblogs.microsoft.com/pix/documentation/

## PIXのインストール
下記からダウンロード＆インストールしてください。

https://devblogs.microsoft.com/pix/download/

## PIXの環境変数の設定
[kafues511さんの記事](https://kafues511.jp/2024/11/30/1754/#toc10)を参考に環境変数の`Path`を設定してください。
例）`C:\Program Files\Microsoft PIX\2409.23`

:::note warn
この設定を省略すると後述の`r.D3D12.AutoAttachPIX=1`を`.ini`ファイルに設定してもUEのビューポートの右上にPIXのアイコンが表示されません。
:::
![UE0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/28df3681-422b-6dc3-2c01-e91c00147171.png)


## PIXの初期設定
### Win11の「開発者モード」を有効に
![Win0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/06b3b38c-8693-f768-ff2d-bef638215524.png)

:::note warn
この設定がないとPIXでキャプチャ後、`Resources`に`Developer mode must be enabled on this device ...`と表示されて適切に利用できません。
:::
![PIX0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/c435da7c-6c7c-56c6-5f64-02d6b80068e2.png)

### NVIDIA コントロールパネルを設定する。
[こちら](https://developer.nvidia.com/nvidia-development-tools-solutions-ERR_NVGPUCTRPERM-permission-issue-performance-counters)を参考に
（１）「開発者設定を有効にする」にチェックを入れます。
![NVIDIA0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/892e0159-297a-9c2e-1922-12ab35f6b182.png)
（２）「GPUパフォーマンス カウンタへのアクセスをすべてのユーザーに許可する」にチェックを入れます。
![Win0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/4c4447f3-595b-34b7-7fab-adf29e170c0a.png)

:::note warn
この設定がないとPIXでキャプチャ後、`Start analysis`をクリックすると下記のダイアログが表示されます。
:::
![PIX0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/9bf058fb-6941-c95b-add7-8daf313ecb3c.png)

## UEの設定

プロジェクト側の`DefaultEngine.ini`、または`UserEngine.ini`に下記を追加します。
```ini:UserEngine.ini
[ConsoleVariables]
r.D3D12.AutoAttachPIX=1
```
:::note info
`UserEngine.ini`は複数プロジェクトで`.ini`の設定を参照したいときに有効です。
`C:\Users\{ユーザ名}\AppData\Local\Unreal Engine\Engine\Config\UserEngine.ini`
:::

また、シェーダのシンボルなどを有効にするため、エンジン側の`Engine\Config\ConsoleVariables.ini`の一部コメントを解除します。
```ini:ConsoleVariables.ini
; Uncomment to get detailed logs on shader compiles and the opportunity to retry on errors, and enable showing shader warnings
r.ShaderDevelopmentMode=1
; Uncomment when running with a graphical debugger (but not when profiling)
; r.Shaders.Optimize=0 ; UE 5.5.0で有効にするとクラッシュする
; When this is enabled, shaders will have extra debugging info. This could change patch sizes, uniqueness, etc and will recompile the shaders
r.Shaders.Symbols=1
; When this is enabled, ShaderName field of FRHIShader will be populated (Development and Debug builds only). 
r.Shaders.ExtraData=1
; Uncomment to skip shader compression. Can save a significant time when using debug shaders.
r.Shaders.SkipCompression=1
```
:::note warn
`r.Shaders.Optimize=0`のコメントを解除するとシェーダーコンパイルでクラッシュします。
`ue5-main`でもクラッシュしていたので、その内に修正されるのを期待。。。

`r.Shaders.SkipCompression=1`が`ECVF_Cheat`フラグでAssertになる（クラッシュはしない）のを気にしない人は`UserEngine.ini`にこの設定を記述しても動作します。
:::

## PIXでプロファイル
### アタッチ
RenderDocと同様にビューポートの右上にアイコンが表示されて、クリックするとキャプチャできますが、
詳細な情報が出てなさそうなので、PIXからのアタッチした方が良い気がします。多分。。。

任意のプロジェクト起動後、PIXのAttachに`UnrealEditor`が表示されるので選択してAttachボタンを押します。
![PIX0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/e4f3ba0f-43d9-2e78-2855-603c0cb19ac1.png)

### キャプチャ
アタッチが完了するとGPU Captureボタンが押せるようになるので、エディタでプロファイルしたい画面にしてカメラアイコンを押します。
![PIX0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/c0f6a7d7-5988-5a7c-3b7e-5074b1866eea.png)

キャプチャされたサムネが表示されるのでクリックするとそれっぽい画面が表示されます。
![PIX0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/0ecfa92d-c3a5-557f-52cc-c606b85a1947.png)

### シェーダデバッグ
`Click here`をクリックすると解析が始まります。

解析が完了後、Pipelineタブでプロファイルしたいパスをキーワードで検索して、
任意のテクスチャのピクセルを選択して`Debug Pixel`をクリックすると
![PIX0007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/8c2596cd-e3e5-2c75-9ac4-7bce58199b49.png)
下記のような感じでシェーダに飛べます！
めでたしめでたし。
![PIX008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958164/f7435d8e-6dfb-9358-4f40-4b4d245942a4.png)

## 参考
- [【UE5】PIXでピクセルデバッグ – Unreal Engine 5.4](https://kafues511.jp/2024/11/30/1754/)
- [PIXでシェーダデバッグする際はwindowsの開発者モードを有効にしなければならない](https://ai-gaminglife.hatenablog.com/entry/2020/12/07/200823)
- [Using Pix On Windows With Unreal Engine](https://dev.epicgames.com/community/learning/knowledge-base/nzK3/using-pix-on-windows-with-unreal-engine?locale=ja-jp)
- [[Graphics]PIX on UE5 Notes](https://dawnarc.com/2024/05/graphicspix-on-ue5-notes/)