2

DirectX 11.1 を理解するのに少し苦労しています。これを使用して従来の Win32 デスクトップ プログラムを構築することに興味がありますが、すべてのドキュメントはメトロ アプリ用です。11.1 は地下鉄アプリ専用ですか? Windows 7 に 11.1 のサポートが追加されたので、そうではないと思います。

以前は、D3D11 の初期化に問題はありませんでした。ポインターを宣言してから、標準の C++ の方法で関数を呼び出すのと同じくらい簡単でした。

ID3D11Device *pDevice;

11.1 では、ComPtr のような多くの新しい機能があります。

ComPtr<ID3D11Device1> pDevice;

また、D3D11.1 デバイスを作成するのではなく、ComPtr の As() 関数を使用して D3D11 から変換するため、ComPtr が必須要件になります。

デスクトップで DX11.1 開発が可能であると仮定すると、この変換ナンセンスなしで従来の初期化を使用する方法はありますか?

それを回避する方法がない場合、デスクトップ用に D3D11.1 を初期化するにはどうすればよいでしょうか?

ありがとうございました。

4

1 に答える 1

4

はい、DirectX11オブジェクトから変換する必要があると思いますがComObj<>、通常のCOMを使用してヘルパーラッパーを使用せずにこれを行うことができますQueryInterface

ID3D11Device* device = NULL;
D3D_FEATURE_LEVEL level;
ID3D11DeviceContext* context = NULL;

HRESULT hr = D3D11CreateDevice(NULL, 
    D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_NULL, 
    NULL,
    0, 
    NULL, 
    0, 
    D3D11_SDK_VERSION, 
    &device, 
    &level, 
    &context);
if (SUCCEEDED(hr))
{
    ID3D11Device1* device1 = NULL;
    // This is equivalent to the ComPtr<>.As<>()
    hr = device->QueryInterface(IID_ID3D11Device1, (void**)&device1);
    if (SUCCEEDED(hr) && (device1 != NULL))
    {
        // device1 now ready

        // when finished with device1
        // (this would be handled automatically by the ComPtr<> destructor)
        device1->Release();
    }

    device->Release();
    context->Release();
}

または、ヘルパー ラッパーを使用して、そこからポインターを取得することもできます。

ID3D11Device1* pDevice1 = device.As<ID3D11Device1>().Detach();
if (pDevice1 != NULL)
{
    // use as before
    // you'll then need to release manually since we detached the reference
    pDevice1->Release();
}

ただし、いずれにしてもヘルパー ラッパーを使用する方が簡単な場合があります。


私の答えは主に COM 参照カウントの処理に関するもので、私のコード フラグメントは MSDN のサンプルに基づいていると思います。ただし、匿名ユーザーは、これらのオブジェクトのいずれかを作成するための優れた実用的な例ではないと指摘しています。

D3D11.1 デバイスを作成するには、機能レベル配列を指定する必要があります。D3D11CreateDevice の MSDN ページを参照してください。また、D3D_DRIVER_TYPE_NULL はレンダリング機能のない参照デバイスであり、元の投稿者が望んでいるものである可能性は低いです。

彼は、機能レベルのデータを追加して、それをD3D11CreateDevice呼び出しに渡すことを提案しています

D3D_FEATURE_LEVEL pFeatureLevels[]={D3D_FEATURE_LEVEL_11_1};
UINT nFeatureLevels=ARRAY_SIZE(pFeatureLevels);

HRESULT hr = D3D11CreateDevice(NULL, 
    D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_HARDWARE, /* was NONE in example I copied */
    NULL,
    0, 
    pFeatureLevels, /* was NULL */
    nFeatureLevels, /* was 0 */
    D3D11_SDK_VERSION, 

など。お役に立てば幸いです-APIについては、コメントできるほどよく知りません。

于 2013-02-11T13:45:59.687 に答える