CVars を有効にして、中間シェーダーのダンプを可能にする
ConsoleVariables.ini ファイル(通常 Engine/Config/ConsoleVariables.ini にあります) 上でこれらの cvars を有効にします:
ShaderCompileWorker を Debug にビルドする
UnrealBuildTool (UBT) では、デフォルトで、ツール用のプロジェクトは常に [Development] にコンパイルされるように生成されます。それらが [Debug] にビルドされるようにするには、ShaderCompileWorker to Debug_Program のソリューション プロパティ (Visual Studio:Build->Configuration Manager) を変更します。
中間ファイルの生成
ここでデバッグ可能なファイルを生成すると良いでしょう。cvars を有効にすれば、その後のコンパイルで生成されたファイルはダンプされ、すべてのシェーダーの再ビルドと、Engine/Shaders/Common.usf への空間または変更の追加が強制的に行われたら、エディタを再起動します。これによりシェーダーが再コンパイルされ、Project/Saved/ShaderDebugInfo フォルダ内のすべての中間ファイルがダンプされます。
ダンプされたシェーダー用フォルダの構造
ダンプ ファイルのフルパスを分析してみましょう:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
プロジェクトのルート パス:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
ダンプするシェーダーのルート パス:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
それぞれのシェーダー フォーマット / プラットフォームに対して、サブフォルダがあります。この場合は PC D3D Shader Model 5 です:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
マテリアル名ごとにフォルダを取得します。特別なフォルダは Global と呼ばれます。ここでは、M_Egg マテリアルです。
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
シェーダーは頂点ファクトリの順番でマップにグループ化されます (ほとんどの場合、メッシュ / コンポーネント タイプと一緒になります)。このケースでは Local Vertex Factory があります。
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
最後に、次のパスは機能の置き換えです。r.DumpShaderDebugShortNames=1 を既に有効にしているので、名前がコンパクトになりました (パスの長さを短くするため)。これを 0 に設定すると、フルパスは次のようになります:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\FLocalVertexFactory\TBasePassPSFNoLightMapPolicy\BasePassPixelShader.usf
このフォルダの中にはバッチファイルと usf ファイルがあります。usf ファイルはプラットフォームのコンパイラに贈られる最後のシェーダー コードです。バッチファイルは中間コードを確認するためにプラットフォーム コンパイラを呼び出す手段です。
ShaderCompileWorker を使ってデバッグする
4.11 から ShaderCompileWorker (SCW) 用の機能が追加され、以下のコマンドラインで、プラットフォーム コンパイラへの呼び出しをデバッグできるようになりました。
PathToGeneratedUsfFile -directcompile -format=ShaderFormat -ShaderType -entry=EntryPoint
- PathToGeneratedUsfFile は、ShaderDebugInfo フォルダから受け取る最後の usf ファイルです。
- ShaderFormat はデバッグ対象のシェーダー プラットフォーム形式です (ここでは PCD3D_SM5)。
- ShaderType Vertex/Pixel/Geometry/Hull/Domain/Compute シェーダー タイプに一致する vs/ps/gs/hs/ds/cs のひとつです。
- EntryPoint はこのシェーダーのusf ファイルでのエントリーポイントの関数名です。
例えば、D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf -format=PCD3D_SM5 -ps -entry=Main
ここで、D3D11ShaderCompiler.cpp 上に CompileD3D11Shader() 関数へのブレークポイントを指定して SCW をコマンドラインで実行すると、プラットフォーム コンパイラの呼び出しをステップ実行することができます。
これに関する詳細は、アンリアル エンジン ドキュメントで次の項目をご覧ください。