Microsoft Visual Studio (2012 バージョン以降) のグラフィックスデバッガーを使用して、Unity エディター、Windows スタンドアロン、ユニバーサル Windows プラットフォームなどのプラットフォームから、デバッグのためにアプリケーションの個々のフレームをキャプチャ (記録) することができます。
Visual Studio にグラフィックスデバッガーをインストールするには、以下の手順を行います。
Tools > Get Tools and Features の順に移動します
Idividual components タブで Games and Graphics までスクロールし、Graphics debugger and GPU profiler for DirectX のチェックボックスをチェックします。
Modify をクリックします。
インストールを待ってから、指示にしたがってコンピューターを再起動します。
Unity エディターで実行しているバージョンではなく、Unity アプリケーションのビルドバージョンを使用して、フレームをキャプチャする必要があります。理由は、エディターが複数の子ウィンドウを同時に開くことがあり、グラフィックスデバッガーが意図しないウィンドウからフレームをキャプチャする場合があるためです。
これらの 2 つのプラットフォームのいずれかでグラフィックスデバッガーを使用するには、ダミーの Visual Studio プロジェクトを作成する必要があります。
Visual Studio 2017 を起動します
ファイル > 新規作成 > プロジェクト > Visual C++ > 空のプロジェクト の順に移動します
プロジェクト > プロパティ > 構成プロパティ > デバッグ の順に移動します
コマンド フィールドで、$(TargetPath) を Unity エディターか Windows スタンドアロンのパスに置き換えます (例えば、C:\MyApp\MyApp.exe)
DirectX 11 で Windows スタンドアロンや Unity エディターを強制的に実行したい場合は、コマンド引数 を選択し、- force-d3d11 と入力します。
デバッグ > グラフィックス > 診断の開始 の順に移動します
すべてが正しく設定されている場合、Unity はアプリケーションの左上に以下のテキストを表示します。
フレームをキャプチャするには、キーボードの Print Screen キーを使用するか、Visual Studio インターフェースの左側にある Capture Frame ボックスをクリックします。
シェーダーをデバッグするには、デバッグシンボルと共にコンパイルする必要があります。これを行うには、#pragma enable_d3d11_debug_symbols を挿入する必要があります。
シェーダーは以下のようになります。
Shader "Custom/NewShader" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
#pragma enable_d3d11_debug_symbols
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
プロセス全体を表示するための基本的な例を紹介します。
新しい Unity プロジェクトを作成します (Unity を初めて使うユーザーのために のページを参照)。
上部のメニューで、Assets > Create > Shader > Standard Surface Shader の順に選択します。これにより、Project フォルダー内に新しいシェーダーファイルが作成されます。
シェーダーファイルを選択し、Inspector ウィンドウで Open をクリックします。スクリプトエディターでシェーダーファイルを開きます。他の #pragma
行以下のシェーダーコードに #pragma enable_d3d11_debug_symbols
を挿入します。
新しいマテリアルを作成します (Assets > Create > Material)。
マテリアルの Inspector ウィンドウで、Shader ドロップダウンを選択し、Custom に移動し、作成したシェーダーを選択します。
3D キューブゲームオブジェクトを作成します (GameObject > 3D Object > Cube)。
新しいマテリアルを新しいゲームオブジェクトに割り当てます。これを行うには、マテリアルを Project ウィンドウから 3D キューブにドラッグします。
Windows スタンドアロン用のプロジェクトをビルドします。実際のプロジェクトは非常に大きく、シェーダーをデバッグするたびにビルドすると非効率になります。その場合は、エディターでデバッグしますが、キャプチャが正しいウィンドウをプロファイリングしていることを確認してください。
前述の Visual Studio で DirectX シェーダーをデバッグ セクションで紹介した手順でフレームをキャプチャします。
キャプチャしたフレームが Visual Studio に表示されます。右クリックして Pixel を選択します。
Vertex Shader の隣にある再生ボタン (上のスクリーンショットで赤い丸の表示) をクリックして頂点シェーダーファイルを開きます。
DirectX 12 での作業には既知の問題があり、再生ボタンが使用できず、「This draw call uses system-value semantics that interfere with pixel history computation (このドローコールは、ピクセル履歴の計算を妨げるシステム値のセマンティクスを使用します)」というエラーが表示されます。このような場合は、代わりにPIX を使用してシェーダーをデバッグします。
ユニバーサル Windows プラットフォーム用にデバッグするとき、ダミーの Visual Studio プロジェクトを手動で作成する必要はありません。なぜなら、Unity がそれを作成するからです。
フレームのキャプチャとシェーダーデバッグの手順は、Unity エディターや Windows スタンドアロンの場合と同じです。
RenderDoc を使ってシェーダーをデバッグすることもできます。RenderDoc では、エディター内から Scene を取得し、デバッグにスタンドアロンツールを使用します。
PIX は、Visual Studio のグラフィックスデバッガーと同様に動作します。グラフィックスデバッガーの代わりに PIX を使用して DirectX 12 プロジェクトをデバッグできます。