Version: 2018.3
テクスチャ配列
PIX を使った DirectX 12 シェーダーのデバッグ

Visual Studio を使った DirectX 11/12 シェーダーのデバッグ

Microsoft Visual Studio (2012 バージョン以降) のグラフィックスデバッガーを使用して、Unity エディター、Windows スタンドアロン、ユニバーサル Windows プラットフォームなどのプラットフォームから、デバッグのためにアプリケーションの個々のフレームをキャプチャ (記録) することができます。

Visual Studio にグラフィックスデバッガーをインストールするには、以下の手順を行います。

  1. Tools > Get Tools and Features の順に移動します

  2. Idividual components タブで Games and Graphics までスクロールし、Graphics debugger and GPU profiler for DirectX のチェックボックスをチェックします。

  3. Modify をクリックします。

  4. インストールを待ってから、指示にしたがってコンピューターを再起動します。

Visual Studio で DirectX シェーダーをキャプチャ

Unity エディターで実行しているバージョンではなく、Unity アプリケーションのビルドバージョンを使用して、フレームをキャプチャする必要があります。理由は、エディターが複数の子ウィンドウを同時に開くことがあり、グラフィックスデバッガーが意図しないウィンドウからフレームをキャプチャする場合があるためです。

Unity エディターまたは Windows スタンドアロンからフレームをキャプチャする手順

これらの 2 つのプラットフォームのいずれかでグラフィックスデバッガーを使用するには、ダミーの Visual Studio プロジェクトを作成する必要があります。

  1. Visual Studio 2017 を起動します

  2. ファイル > 新規作成 > プロジェクト > Visual C++ > 空のプロジェクト の順に移動します

  3. プロジェクト > プロパティ > 構成プロパティ > デバッグ の順に移動します

  4. コマンド フィールドで、$(TargetPath) を Unity エディターか Windows スタンドアロンのパスに置き換えます (例えば、C:\MyApp\MyApp.exe)

  5. DirectX 11 で Windows スタンドアロンや Unity エディターを強制的に実行したい場合は、コマンド引数 を選択し、- force-d3d11 と入力します。 プロジェクトのプロパティー

  6. デバッグ > グラフィックス > 診断の開始 の順に移動します

  7. すべてが正しく設定されている場合、Unity はアプリケーションの左上に以下のテキストを表示します。 Unity エディターのデバッガメッセージ

  8. フレームをキャプチャするには、キーボードの Print Screen キーを使用するか、Visual Studio インターフェースの左側にある Capture Frame ボックスをクリックします。 Visual Studioインターフェースの Capture Frame

Visual Studio で DirectX シェーダーをデバッグ

シェーダーをデバッグするには、デバッグシンボルと共にコンパイルする必要があります。これを行うには、#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"
}

ワークフローの例

プロセス全体を表示するための基本的な例を紹介します。

  1. 新しい Unity プロジェクトを作成します (Unity を初めて使うユーザーのために のページを参照)。

  2. 上部のメニューで、Assets > Create > Shader > Standard Surface Shader の順に選択します。これにより、Project フォルダー内に新しいシェーダーファイルが作成されます。

  3. シェーダーファイルを選択し、Inspector ウィンドウで Open をクリックします。スクリプトエディターでシェーダーファイルを開きます。他の #pragma 行以下のシェーダーコードに #pragma enable_d3d11_debug_symbols を挿入します。

  4. 新しいマテリアルを作成します (Assets > Create > Material)。

  5. マテリアルの Inspector ウィンドウで、Shader ドロップダウンを選択し、Custom に移動し、作成したシェーダーを選択します。

  6. 3D キューブゲームオブジェクトを作成します (GameObject > 3D Object > Cube)。

  7. 新しいマテリアルを新しいゲームオブジェクトに割り当てます。これを行うには、マテリアルを Project ウィンドウから 3D キューブにドラッグします。

  8. Windows スタンドアロン用のプロジェクトをビルドします。実際のプロジェクトは非常に大きく、シェーダーをデバッグするたびにビルドすると非効率になります。その場合は、エディターでデバッグしますが、キャプチャが正しいウィンドウをプロファイリングしていることを確認してください。

  9. 前述の Visual Studio で DirectX シェーダーをデバッグ セクションで紹介した手順でフレームをキャプチャします。

  10. キャプチャしたフレームが Visual Studio に表示されます。右クリックして Pixel を選択します。

    キャプチャしたフレーム、History、カスタムシェーダーが割り当てられたオブジェクトの Pixel を選択
    キャプチャしたフレーム、History、カスタムシェーダーが割り当てられたオブジェクトの Pixel を選択
  11. Vertex Shader の隣にある再生ボタン (上のスクリーンショットで赤い丸の表示) をクリックして頂点シェーダーファイルを開きます。 頂点シェーダーのデバッグ

DirectX 12 での作業には既知の問題があり、再生ボタンが使用できず、「This draw call uses system-value semantics that interfere with pixel history computation (このドローコールは、ピクセル履歴の計算を妨げるシステム値のセマンティクスを使用します)」というエラーが表示されます。このような場合は、代わりにPIX を使用してシェーダーをデバッグします。

ユニバーサル Windows プラットフォーム

ユニバーサル Windows プラットフォーム用にデバッグするとき、ダミーの Visual Studio プロジェクトを手動で作成する必要はありません。なぜなら、Unity がそれを作成するからです。

フレームのキャプチャとシェーダーデバッグの手順は、Unity エディターや Windows スタンドアロンの場合と同じです。

その他のシェーダーデバッグテクニック

RenderDoc を使ってシェーダーをデバッグすることもできます。RenderDoc では、エディター内から Scene を取得し、デバッグにスタンドアロンツールを使用します。

PIX は、Visual Studio のグラフィックスデバッガーと同様に動作します。グラフィックスデバッガーの代わりに PIX を使用して DirectX 12 プロジェクトをデバッグできます。


テクスチャ配列
PIX を使った DirectX 12 シェーダーのデバッグ