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 をコマンドラインで実行すると、プラットフォーム コンパイラの呼び出しをステップ実行することができます。

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

最近の投稿

最新技術を先取りチェック:間もなく実現、アンリアルのリアルタイム レイトレーシング

「リアルタイム」と「レイトレーシング」はかつて相反する言葉でした。しかしNVIDIA RTX 技術の登場により、アンリアル エンジンでのリアルタイム ...

西部劇風ビジュアルの大乱闘 FPS、『Sky Noon』の制作背景

ニュージーランドを拠点とするインディー デベロッパー チームであり、Unreal Dev Grant を受賞した Lunar Rooster が、ユニ...

GitHub アカウントと Epic Games アカウントの紐付けの認証プロセスのアップデート

ユーザー エクスペリエンスとセキュリティの向上のために、GitHub アカウントと Epic Games アカウントの紐付けプロセスに OAuth 機...