Visual Studio 2012にはVisual Studio Graphics Diagnosticsと呼ばれるグラフィックスデバッグ機能が新機能に入っています.
Graphics Diagnostics
http://msdn.microsoft.com/en-us/library/hh873207.aspx
この機能は,従来からDirectX SDKに付属していたPIX for Windowsとは異なった新しいツールでPIXの用にパフォーマンスの計測や負荷の分析というよりはデバッグに重きを置いているようで処理時間の計測などは出来ないようですが,シェーダデバッガやイベントのトレースなどが行えるようです.前々から機能として入っているのは知っていたのですが,ようやくWindows 7からシェーダデバッガの使い方がわかったのでこの記事では,Visual Studio 2012 ProでGraphics Diagnosticsを軽く使ってみてシェーダでバッグなどのやり方を紹介していきます.
なお,シェーダデバッガは描画用のシェーダである頂点シェーダ,ピクセルシェーダの他にテセレーションに絡むハルシェーダ,ドメインシェーダ,そしてジオメトリシェーダがデバッグできます.なお,コンピュートシェーダは現在のところ非対応です.
コンピュートシェーダが非対応ということは,下記の記事のUnderstanding the HLSL Debuggerのところに書かれています.
HLSL Debugging
http://msdn.microsoft.com/en-us/library/hh873197.aspx
※記事中の画像はクリックすると翁サイズになります.
Graphics Diagnosticsを起動した際のVisual Studioの様子は上記のような感じです.真ん中にキャプチャしたプログラムの1フレームの描画結果,左にDirect3D情報,右にキャプチャした描画結果上でクリックしたピクセルのピクセル履歴,中央下右がグラフィックスパイプラインステージ表示でこれは1つのDrawCallの中のグラフィックスパイプラインの処理を可視化しています.このような感じで,デバッグを行います.
Graphics Diagnosticsの起動は,下記のスクリーンショットのように【デバッグ】メニューの【グラフィックス】,【診断の開始】を選びます.【診断の開始】を選ぶとプログラムが起動します.
プログラムは通常のビルド→実行と同じように起動しますが,左上にGraphics DiagnosticsのHUDがオーバーレイされフレーム番号や起動時間などが表示されます(下記の例ではDXUTのHUDがかぶり少し見づらいですが).ここで【PrtScn】キーを押すとキャプチャされVisual Studio上でデバッグを開始することが出来ます.
Graphics Diagnosticsで見ることができるのは,下記になります.ただし,DirectXコントロールパネルはデバッグ機能ではありません.
・イベント一覧・・・Direct3D APIの呼び出し履歴の表示
・ピクセル履歴・・・描画結果のピクセルをマウスでクリックするとそのピクセルの変更や描画履歴が一覧で出ます.ここから選んだピクセルに絡むシェーダでバッグができます(詳細は後述).
・パイプラインステージ・・・ある描画コールのGPUのパイプラインの実行の流れが可視化される.実行されたシェーダステージ(シェーダデバッガが起動できる)や入力アセンブラや出力マージャーなどのチェックが出来ます.
・オブジェクトテーブル・・・Direct3Dのバッファやシェーダリソースビュー(テクスチャやレンダーターゲット),定数バッファ,構造化バッファなどの一覧と中身の確認ができる(ただしいテクスチャが読まれてるかのチェックなどが出来る).
・イベント呼び出し履歴・・・イベントのコールスタック。
今回の本題であるシェーダのデバッグは,ピクセル履歴かパイプラインステージから開始できます.
ピクセル履歴
ピクセル履歴からのシェーダでバッグの開始は,デバッグしたい描画コールを選択すると実行されてるシェーダが出てくるのでその横の緑の三角を選択します.ピクセル履歴からのシェーダでバッグではクリックしたピクセルに関連する頂点(頂点の場合,1頂点ではなくそこに絡む複数の頂点が候補として出る)やその座標のピクセルをピンポイントで選択できるので描画がおかしい部分を実際のパラメータでデバッグできます.
パイプラインステージ
パイプラインステージは,イベント一覧やピクセル履歴でDrawCallを選択すると分析が行われて表示されます.上記のケースでは,頂点シェーダとピクセルシェーダが動いていますがテセレーションなどが実行されていれば他のシェーダステージも出てきます.ここでは,各シェーダステージの下の緑の三角を押すとデバッグが開始できます.ここではピクセル履歴の時と違って任意のピクセルの座標や頂点から開始はできず,0番目のものが実行されるようです.ここで任意の場所から開始する方法はちょっと今回わかりませんでした.
シェーダデバッガが起動すると下記のようにシェーダのソースコードが表示されステップ実行や変数のウォッチ,ブレークポイントを打つなどのC++のコードをデバッグするのに近いことが出来ます.
上記のスクリーンショットでは,シェーダのデバッグはHLSLで行われていますが,これはシェーダのコンパイルの時にデバッグ情報を出力しているためできています.シェーダのコンパイル時にデバッグ情報を出力しない場合はマイクロコードデバッグになります.変数のウォッチなどもC++のデバッグと同じように出来ますが,値の書き換えなどは出来ません.それからデバッグ情報を出力しても最適化オプションがついていると見れない変数があったりします.
この他にデバッグ機能として必要と思われるのは,セットしたテクスチャの中身や描画結果などですがこれはオブジェクトテーブルから参照されてるテクスチャやレンダーターゲットの確認ができますのでそちらで見ることができます.
まとめ
とりあえず駆け足ですが,Windows 7とVisual Studio 2012 Proでシェーダデバッガを呼び出すところまでを紹介することが出来ました.色々とまだまだ機能的な制限(特にコンピュートシェーダがサポートされてないのがきつい)はありますが,1台のPCでVisual Studio上でGPUベンダーを問わずデバッグが出来るというのは大きな前進で,シェーダ開発の開発効率を上げてくれる機能として期待できそうです(この他にVisual Studio 2012ではHLSLの開発支援機能が色々とあるので).この機能だけでもVisual Studio 2012に移る価値はあるかもしれませんね.
なお,残念なことにこの機能はVisual Studio 2012 Express Edition for Desktopみはありません.for Windows 8についてるかどうかは未確認なのでExpressが利用できるようになったら確認してみたいと思います.