2016年4月19日

シェーダー コンパイルのデバッグ プロセス

作成 Rolando Caloca

CVars を有効にして、中間シェーダーのダンプを可能にする

ConsoleVariables.ini ファイル(通常 Engine/Config/ConsoleVariables.ini にあります) 上でこれらの cvars を有効にします:

cVars

ShaderCompileWorker を Debug にビルドする

UnrealBuildTool (UBT) では、デフォルトで、ツール用のプロジェクトは常に [Development] にコンパイルされるように生成されます。それらが [Debug] にビルドされるようにするには、ShaderCompileWorker to Debug_Program のソリューション プロパティ (Visual Studio:Build->Configuration Manager) を変更します。

solution config

中間ファイルの生成

ここでデバッグ可能なファイルを生成すると良いでしょう。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 をコマンドラインで実行すると、プラットフォーム コンパイラの呼び出しをステップ実行することができます。

これに関する詳細は、アンリアル エンジン ドキュメントで次の項目をご覧ください。