PIXを活用する その1

PIXとは

3Dゲームを開発している時に必ずといってあるのが、モデルが意図しない状態で表示されるという問題です。「色が変」や「形が変」と言う比較的原因が予想しやすい問題から「画面になにも出ない」といった原因を判断するのが困難な場合まで様々な問題があります。特にシェーダープログラムを使っているとこういった問題に直面する機会は多くなります。

こういった問題の原因を見つけるのに非常に有用なツールとして、Direct X SDKに付属するPIX for Windowsがあります。このツールは元々、初代Xbox用に開発されたPerformance Investigator for Xbox (PIX)だったのですが、これを使った人達からの強い要望でWindows版が作られました。

XNA FrameworkはDirect X上で動作しているので、XNA GS用に作られたゲームもPIX for Windowsを使うことができます。

PIXの主な機能としては

  • 1フレーム、もしくは複数のフレームのレンダリング情報のキャプチャ
  • レンダリングに使われたDirect Xの描画関連命令の表示
  • リソース使用量の表示
  • 各段階でのグラフィクスリソースの状態表示
    • レンダーステート
    • テクスチャ、レンダーターゲット
    • 頂点情報
    • シェーダー情報
  • シェーダーデバッガ

があります。

PIXの基本的な使い方

Direct X SDKをインストールした状態で(ここではAugust 2008を例にします)、スタートメニューからMicrosoft DirectX SDK (August 2008)/DirectX Utilities/PIX for Windowsを選択してPIX for Windowsを起動します。

FileメニューからNew Experimentを選択すると以下の画面が表示されます。

pix00

Program pathに対象となる実行ファイルを指定し、"A single-frame capture of Direct3D whenever F12 is pressed"のラジオボタンを選択して、右下にある"Start Experiment"ボタンを押すと、Program pathに指定した実行ファイルが実行されます。ここではSkinningSampleを使っています。

pix01

単独で実行させるのと違うのは、画面の左上にフレーム数などの情報が表示されています。キャプチャしたいシーンになったらF12キーを押してフレーム情報をキャプチャします。レンダリングするシーンの複雑さによってキャプチャに掛かる時間は変わってきます。

キャプチャした後にゲームを終了させると、PIX for Windowsに複数のウィンドウが表示されます。

pix03

この複数のウィンドウは上から順にCPUの作業時間をグラフで示すTimelineウィンドウ、グラフィクスリソース確保状況を表示するObjectsウィンドウ、左下はキャプチャしたフレーム内で起きたイベントを表示するEventsウィンドウ、そして右下が詳細を表示するDetailsウィンドウとなっています。

ここで、Eventsウィンドウで調べたいフレームを選択したあとに、Detailsウィンドウ内のRenderタブをクリックすると以下の画面になります。

pix04

PIXをシェーダーデバッガとして使う

このRenderタブにはフレームのレンダリング結果が表示されます。また、Eventsウィンドウの選択したフレームを開くと中には複数のイベントが表示されていますが、ここにはXNA Frameworkではなく、Direct Xのイベントが表示されます。ここからデバッグしたいDrawIndexedPrimitiveメソッドを探し出すのは面倒なので、今回は簡単な方法を紹介します。

それはRenderタブに表示されている画面上でデバッグしたいモデルの場所で右クリックして表示されるメニューからDebug This Pixel... を選択する方法です。ここでは、おっさんのアーマー部分を選択しました。

pix05

Debug This Pixel...を選択すると、DetailsウィンドウにDebuggerタブが追加され、選択したピクセルがどのようにレンダリングされたいるかの情報が表示されます。レンダリング開始時のフレームバッファーの色、クリアーした時の色、モデルをレンダリングしたときの色と、時系列に表示されています。もし、ここで表示されるリストが多い場合は重ね塗りが何度も起こっているのでフィルレートに影響しているということが判ります。

pix06

今回デバッグしたいのはおっさんのアーマー部分のシェーダーなので、リストの中からDrawIndexedPrimitiveメソッドを使って赤っぽくなっているピクセルを探します。

pix07

DrawIndexedPrimitiveを使っているピクセルでは、そのピクセルを描画するのに使われた三角形の各頂点の頂点シェーダー、そしてピクセルシェーダーをデバッグすることができます。ここでは "Debug Vertex 0" をクリックして頂点シェーダーのデバッグをすることにします。"Debug Vertex 0"をクリックすると以下のように、Debuggerタブ内に更にシェーダーアセンブリを表示するDisassemblyタブ、ソーソコードを表示するタブ(ここではSkinnedModel.fx)が表示されます。

pix11

ここで、ソースコードをPIX上で表示するにはシェーダーソースコードにコンパイル元のファイル情報が記載されている必要があります。XNA Frameworkではデバッグ設定でシェーダーをコンパイルすると、この情報を自動的に追加するようになっているので、プロジェクトをデバッグ設定でコンパイルすることでPIX上でソースコードレベルでのデバッグができるようになっています。逆に言えば、アセンブリしか表示されない場合はプロジェクトのコンパイル設定がリリースになっているのが原因と思われます。

pix12

Visual Studio上で提供されているデバッグ機能には及ばないにしても、ステップ実行や実行後の変数の状態表示など、デバッグするのに必要最低限の機能はあるので、シェーダーコードのデバッグをするのに大いに役立ちます。

PIXをシェーダーデバッガとして使うときの注意点

  • ソースコードレベルでのデバッグをするときには、プロジェクトをデバッグ設定でコンパイルする

次回に続く