DirectX グラフィックスのデバッグ
Visual Studio には、DirectX ベースのゲームやアプリケーションのレンダリングに関する問題の解決に役立つ診断ツールが用意されています。
Visual Studio での DirectX グラフィックスのデバッグ
通常、ゲームまたはアプリケーションのレンダリングに関する問題のデバッグは、デバッガーを起動してコードを順を追って確認するような簡単な作業ではありません。グラフィックスのレンダリングに関する問題の診断には、いくつかのユニークな課題があります。たとえば、ある特定のフレームで、何百万には達しないまでも、何百何千もの大量のピクセルが出力として生成され (見られることのないピクセルはその数倍生成されている可能性があります)、そのような診断対象のうち、問題が発生しているのはほんの少数である場合があります。また、レンダリングされる各フレームの背後には数 GB のデータがある場合があり、さらに複雑なことに、これらのデータはすべて専用のハードウェアによって、作業を何百何千もの特化した処理単位に分割して処理される上、すべて CPU (中央処理装置) による直接的な監視の範囲外で実行されます。従来のデバッガーは、このような課題を解決するように構築されていません。
Visual Studio のグラフィックス診断ツールは、レンダリングに関する問題の原因を見つけるのに役立つように設計されています。まず、表示の不具合から問題を特定し、次に、関連するシェーダー コード、グラフィックス パイプライン、描画呼び出し、リソース、デバイスの状態だけでなく、アプリケーションのソース コードにもさかのぼってトレースします。
Visual Studio を役立てることができるレンダリングに関する問題の一部を次に示します。
デバイスの状態
グラフィックス デバイスの正しい構成は、アプリケーション全体を通して満たす必要があるモデル データやテクスチャ データの予測を設定するため、重要です。たとえば、デバイスの状態によってワインディング順序が時計回りに指定されている場合、反時計回りに頂点が指定されるモデルは正しく表示されません。また、深さテストの関数が大なりに設定されている場合、より離れたオブジェクトがより近いオブジェクトの上に描画されます。デバイスの状態に関する問題は、ソース コード上で問題の原因が影響を受けるオブジェクトから離れていることが多いため、診断が困難です。
グラフィックス診断を使用すると、影響を受けるピクセルの背後のデータとデバイスの状態を調べることができるため、デバイスの状態に関する問題の的を絞ることができます。
シェーダーのバグ
アプリケーション コードの記述において、コードが C++ であっても HLSL (上位レベル シェーダー言語) であっても、間違いを避けることはほぼ不可能です。ただし、C++ などの言語に用意されている豊富なデバッグ サポートが存在しないため、従来より HLSL コードのデバッグはより困難です。
グラフィックス診断を使用すると、HLSL コードをデバッグできるため、シェーダーのバグを検索して修復できます。グラフィックス ログにキャプチャされた情報を使用し、HLSL デバッガーを使用して描画イベントをシェーダー レベルで "再現" することによって、実行と設定されたブレークポイントを順を追って確認し、一時変数、パラメーター、および定数バッファーの内容を調査できます。正しい的に焦点を合わせられるように、グラフィック診断には、描画イベント ([グラフィックス パイプライン ステージ] ウィンドウを使用) または個々のピクセル ([グラフィックス ピクセル履歴] を使用) から HLSL デバッガーへのエントリ ポイントが用意されています。
初期化されていないまたは無効なパラメーターと定数
グラフィックス アプリケーションは、パラメーターと定数バッファーを使用してグラフィックス パイプラインに情報を効率的に提供するため、異なるオブジェクトはカスタム シェーダー コードによって変換されるか別のオブジェクトとして表示されます。定数バッファーまたはパラメーターが初期化されている場合や、目的の値が含まれない場合、対応するオブジェクトが間違って、または、まったく表示されません。定数バッファーまたはパラメーターの問題はエラーは、定数バッファーまたはパラメーターの問題によって、または常にでないかどうか、および、シェーダーが対応するのは、シェーダー バグの原因は、シェーダー コードのバグによってオフにするための診断が難しい場合があります。
グラフィックス診断を使用すると、エラーに対応するシェーダーを識別し、HLSL デバッガーを使用してシェーダー コードを検査できるため、パラメーターおよび定数バッファー問題に絞り込むことができます。シェーダー コードが正しいことを確認したら、HLSL デバッガーを使用して疑わしいパラメーターや定数を識別し、[グラフィックス イベント呼び出し履歴] を使用してアプリケーション コード内の影響を受けるオブジェクトをレンダリングする部分に移動して、パラメーターまたは定数バッファーが最後に設定された場所を検索できます。
DirectX のバージョンの互換性
グラフィックス診断は Direct3D 10、Direct3D 10.1、Direct3D 11、および Direct3D 11.1 を使用するアプリケーションをサポートし、Direct2D を使用するアプリケーションへのサポートは制限されています。旧バージョンの Direct3D、DirectDraw、または他のグラフィックス API を使用するアプリケーションはサポートしません。
Direct2D の制限されたサポート
Direct2D API の機能の大半で Direct3D API の機能を使用するため、グラフィックス診断を使用して Direct2D を使用するアプリケーションをデバッグできます。ただし、グラフィックス診断では高度な Direct2D のイベントではなく基になる Direct3D イベントがフックされるため、Direct3D を使用しない Direct2D のイベントの詳細はキャプチャされません。また、Direct2D API 呼び出しと結果の Direct3D API 呼び出しの間の関連性が必ずしも明らかではないため、Direct 2D アプリケーションでのグラフィックス診断の使用は複雑です。それでも、グラフィックス診断を使用して Direct2D を使用するアプリケーションで発生する低水準のレンダリングに関する問題の情報は取得できます。
オペレーティング システムと SDK の要件
Windows 8 では、このドキュメントで説明するグラフィックスのデバッグ機能に必要なランタイム コンポーネントがインストールされます。Windows 7 および Windows Vista でこれらの機能を使用するには、次の SDK (Software Development Kit) の 1 つをインストールする必要があります。
DirectX SDK (June 2010)
Windows SDK (Version 7.1)
関連トピック
Title |
説明 |
---|---|
グラフィックス診断を使用して、DirectX ベースのアプリケーションで発生するレンダリングの問題を診断し、デバッグする方法について説明します。 |
|
グラフィックス診断を使用する方法をグラフィックスの情報を取り込む共通のレンダリングの問題を診断する方法に関するトピックへのリンクを示します。 |
|
Visual Studio のデバッグ機能を紹介します。 |
|
DirectX のグラフィックス手法を説明するトピックへのリンクを示します。 |