デバッグ レイヤーを使用してアプリをデバッグする
デバッグ レイヤーを使用してアプリをデバッグし、エラーと警告がクリーンされていることを確認することをお勧めします。 デバッグ レイヤーは、Direct3D コードの記述に役立ちます。 また、デバッグ レイヤーは開発者の生産性も高めます。はっきりしないレンダリング エラーや、黒い画面でさえも、その原因をすぐにソースで突き止めることができるからです。 デバッグ レイヤーは、さまざまな問題について警告します。 たとえば、デバッグ レイヤーには、次の問題に対する警告が表示されます。
- テクスチャの設定を忘れたが、ピクセル シェーダーでテクスチャを読み取る
- 出力深度が、深度ステンシルの状態がバインドされていない
- INVALIDARG でテクスチャの作成に失敗しました
ここでは、デバッグ レイヤーを有効にする方法と、 デバッグ レイヤー を使用して防止できるいくつかの問題について説明します。
デバッグ レイヤーの有効化
デバッグ レイヤーを有効にするには、D3D11CreateDevice 関数を呼び出してレンダリング デバイスを作成するときに、Flags パラメーターに D3D11_CREATE_DEVICE_DEBUG フラグを指定します。 次のコード例は、Microsoft Visual Studio プロジェクトがデバッグ ビルドにあるときにデバッグ レイヤーを有効にする方法を示しています。
UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if defined(_DEBUG)
// If the project is in a debug build, enable the debug layer.
creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
// Define the ordering of feature levels that Direct3D attempts to create.
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_1
};
ComPtr<ID3D11Device> d3dDevice;
ComPtr<ID3D11DeviceContext> d3dDeviceContext;
DX::ThrowIfFailed(
D3D11CreateDevice(
nullptr, // specify nullptr to use the default adapter
D3D_DRIVER_TYPE_HARDWARE,
nullptr, // specify nullptr because D3D_DRIVER_TYPE_HARDWARE
// indicates that this function uses hardware
creationFlags, // optionally set debug and Direct2D compatibility flags
featureLevels,
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION, // always set this to D3D11_SDK_VERSION
&d3dDevice,
nullptr,
&d3dDeviceContext
)
);
デバッグ レイヤーを使用したアプリでのエラーの防止
Direct3D 11 API を誤用した場合、または不適切なパラメーターを渡すと、 デバッグ レイヤーのデバッグ 出力でエラーまたは警告が報告されます。 その後、間違いを修正できます。 次に、未定義の動作やオペレーティング システムのクラッシュを引き起こす可能性があるコーディングの問題について説明します。 デバッグ レイヤーを使用して、これらの問題をキャッチして防ぐことができます。
NULL ポインターを Map に渡さないでください
ID3D11DeviceContext::Map メソッドの pResource パラメーターまたは pMappedResource パラメーターに NULL を渡すと、Map の動作は未定義になります。 コア レイヤーのみをサポートするデバイスを作成した場合、Map の無効なパラメーターによってオペレーティング システムがクラッシュする可能性があります。 デバッグ レイヤーをサポートするデバイスを作成した場合、この無効なマップ呼び出しでデバッグ出力からエラーが報告されます。
ソース リソースと移行先リソース内にソース ボックスを閉じ込める
ID3D11DeviceContext::CopySubresourceRegion メソッドの呼び出しでは、ソース ボックスがソース リソース内にある必要があります。 変換先のオフセット (x、y、z) を使用すると、変換先リソースに書き込むときにソース ボックスをオフセットできますが、ソース ボックスとオフセットのサイズはリソースのサイズ内である必要があります。 コピー先リソースの外部にコピーしようとした場合、またはソース リソースよりも大きいソース ボックスを指定しようとすると、 CopySubresourceRegion の動作は未定義です。 デバッグ レイヤーをサポートするデバイスを作成した場合、デバッグ出力は、この無効な CopySubresourceRegion 呼び出しでエラーを報告します。 CopySubresourceRegion に無効なパラメーターを指定すると、未定義の動作が発生し、レンダリング、クリッピング、コピーなし、またはレンダリング デバイスの削除が発生する可能性があります。
DiscardResource または DiscardView を削除しない
リソースを正しく作成しない限り、ランタイムは ID3D11DeviceContext1::D iscardResource または ID3D11DeviceContext1::D iscardView の呼び出しを削除します。
ID3D11DeviceContext1::D iscardResource に渡すリソースは、D3D11_USAGE_DEFAULTまたはD3D11_USAGE_DYNAMICを使用して作成されている必要があります。それ以外の場合、ランタイムは DiscardResource への呼び出しを破棄します。
ID3D11DeviceContext1::D iscardView に渡すビューの基になるリソースは、D3D11_USAGE_DEFAULTまたはD3D11_USAGE_DYNAMICを使用して作成されている必要があります。それ以外の場合、ランタイムは DiscardView の呼び出しを削除します。
デバッグ 層をサポートするデバイスを作成した場合、デバッグ出力は、ドロップされた呼び出しに関するエラーを報告します。
関連トピック