1

DirectX11 を使用したゲーム プログラミングを学習するためのチュートリアルに従っています。サンプル コードを実行すると、次のエラーが表示されます。

First-chance exception at 0x76E12EEC in Chapter1.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x0307E824. HRESULT:0x887A0004

問題は、次のコードの featureLevel と creationFlag にあるようです。

hr = D3D11CreateDevice(
            nullptr,
            D3D_DRIVER_TYPE_HARDWARE,
            nullptr,
            creationFlags, 
            featureLevels, 
            ARRAYSIZE(featureLevels),
            D3D11_SDK_VERSION, 
            &device, 
            &featureLevel,
            &context);  
    ThrowIfFailed(hr);

ただし、creationFlags と featureLevels の値を 0 と nullptr に変更すると、コードは正常に機能します。Windows 8.1 および Windows SDK 8.0 で Visual Studio 2012 を使用しています。

関連するコードは次のとおりです。

UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;

#if defined(_DEBUG)
    // For debugging
    creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

    D3D_FEATURE_LEVEL featureLevels[] = 
    {
        D3D_FEATURE_LEVEL_11_1,
        D3D_FEATURE_LEVEL_11_0,
    };

コードに本当に問題があるという意味ではないという最初のチャンスの例外について読みましたが、ただ消えるわけではありません。私は何をすべきか?

4

1 に答える 1

3

問題

D3D_FEATURE_LEVEL_11_1と のみを渡すD3D_FEATURE_LEVEL_11_0ため、関数は失敗し、そうでないものD3D11CreateDevice()を返し、関数は例外をスローします。HRESULTS_OKThrowIfFailed(hr);

GPU が DirectX 10 のみをサポートしている場合、DirectX 11 ハードウェア デバイスとコンテキストを作成できませCreatedevice*()ん。関数は失敗します。下位レベルのハードウェアで DirectX 11 API (DirectX 11 の機能ではない) を使用できるようにするために、Microsoft は機能レベルを導入しました。

直し方?

従来のデバイス作成方法を使用するだけです。可能なすべての機能レベルで配列を渡す必要があります

D3D_FEATURE_LEVEL arrFeatLevels [] =
{
    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_2,
    D3D_FEATURE_LEVEL_9_1,
};

そのため、DirectX API はサポートされている最高のものを自動的に選択します。(デバイスの作成後、返された を見て、どのデバイスが選択されたかを確認できます&featureLevel):

if(featureLevel >= D3D_FEATURE_LEVEL_11_0)
    std::cout << "Yay! we using D3D11! :) " << std::endl;
else if( featureLevel >= D3D_FEATURE_LEVEL_10_0)
    std::cout << "Oh noes! only D3D10 available! :(" <<std::endl;
else
    std::cout << "Man, where did you take that old videocard? =\ " <<std::endl;

DirectX 11 の機能 (シェーダー モデル 5、テッセレーション シェーダー、計算シェーダーなど) は、機能レベルが より低いデバイス/コンテキストでは使用できないことに注意してくださいD3D_FEATURE_LEVEL_11_0。同様に、DirectX 10 の機能 (ジオメトリ シェーダーなど) は、機能レベルが より低い場合は使用できませんD3D_FEATURE_LEVEL_10_0。ハードウェアでサポートされているすべての機能は、通常どおり実行されます。

また、ハードウェアでサポートされていない機能をテストする方法もあります。ソフトウェア エミュレートされたWARP デバイスを作成できます: pass D3D_DRIVER_TYPE_WARP。これは非常に遅く、運用コード向けではありませんが、開発者が最上位のハードウェアを持っていなくても、D3D11 の機能をテストおよびデバッグできます。

GPU の機能はどこにありますか?

GPU メーカーのサイト。または、 GPU-Z (DX サポートを表示) やGPU Caps Viewer (多くの OpenGL 機能を表示) などのツールを使用するだけです。

ハッピーコーディング!= )

于 2013-11-07T08:27:37.580 に答える