次の方法で共有


デバッグ レイヤーを使用してアプリをデバッグする

デバッグ レイヤーを使用してアプリをデバッグし、エラーと警告がクリーンされていることを確認することをお勧めします。 デバッグ レイヤーは、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 の呼び出しを削除します。

デバッグ 層をサポートするデバイスを作成した場合、デバッグ出力は、ドロップされた呼び出しに関するエラーを報告します。

ソフトウェア レイヤー