次の方法で共有


デバイスの選択 (Direct3D 9)

アプリケーションでは、ハードウェアに対してクエリを実行して、サポートされている Direct3D デバイスの種類を検出できます。 このセクションには、ディスプレイ アダプターの列挙と Direct3D デバイスの選択に関連する主要なタスクに関する情報が含まれています。

アプリケーションは、適切な Direct3D デバイスを選択するために一連のタスクを実行する必要があります。 次の手順は、全画面表示アプリケーションを対象としており、ほとんどの場合、ウィンドウ化されたアプリケーションでは、これらの手順のほとんどをスキップできることに注意してください。

  1. 最初に、アプリケーションはシステム上のディスプレイ アダプターを列挙する必要があります。 アダプターは、ハードウェアの物理的な部分です。 デュアルヘッド ディスプレイの場合と同様に、グラフィックス カードには複数のアダプターが含まれている場合があることに注意してください。 マルチモニターのサポートに関係のないアプリケーションは、この手順を無視し、手順 2 で IDirect3D9::EnumAdapterModesメソッドにD3DADAPTER_DEFAULTを渡すことができます。

  2. 各アダプターについて、アプリケーションは IDirect3D9::EnumAdapterModes呼び出すことによって、サポートされている表示モードを列挙します。

  3. 必要に応じて、次のコード例に示すように、IDirect3D9::CheckDeviceType呼び出すことによって、各列挙表示モードでハードウェア アクセラレーションが存在するかどうかを確認します。 これは、IDirect3D9::CheckDeviceTypeで使用できる用途の 1 つだけであることに注意してください。詳細については、ハードウェア サポートの決定 (Direct3D 9)を参照してください。

    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    Params.BackBufferFormat = D3DFMT_X1R5G5B5; 
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, 
                      Device.m_DevType, 
                      Params.BackBufferFormat, Params.BackBufferFormat, 
                      FALSE))) 
        return E_FAIL;
    
  4. アプリケーションは、IDirect3D9::GetDeviceCaps メソッドを呼び出すことによって、このアダプター上のデバイスの必要なレベルの機能をチェックします。 このメソッドによって返される機能は、IDirect3D9::CheckDeviceTypeによって検証されたすべての表示モードでデバイスに対して定数であることが保証されます。

  5. デバイスは、デバイスでサポートされている列挙表示モードの形式のサーフェスに常にレンダリングできます。 アプリケーションが別の形式のサーフェスにレンダリングする必要がある場合は、IDirect3D9::CheckDeviceFormat呼び出すことができます。 デバイスが形式にレンダリングできる場合は、IDirect3D9::GetDeviceCaps によって返されるすべての機能が適用可能であることが保証されます。

  6. 最後に、アプリケーションは、IDirect3D9::CheckDeviceMultiSampleType メソッドを使用して、フルシーン アンチエイリアシングなどのマルチサンプリング手法がレンダー形式でサポートされているかどうかを判断できます。

上記の手順を完了した後、アプリケーションには、動作可能な表示モードの一覧が必要です。 最後の手順では、必要な数のバッファーとアンチエイリアシングに対応できる十分なデバイスアクセス可能なメモリが使用可能であることを確認します。 このテストは、モードとマルチサンプルの組み合わせのメモリ消費量を確認せずに予測できないために必要です。 さらに、一部のディスプレイ アダプター アーキテクチャでは、デバイスからアクセスできるメモリの量が一定でない場合があります。 つまり、アプリケーションは、全画面表示モードになったときに、ビデオメモリ不足のエラーを報告できる必要があります。 通常、アプリケーションは、ユーザーに提供するモードの一覧から全画面表示モードを削除するか、バック バッファーの数を減らすか、より複雑でないマルチサンプリング手法を使用して、より少ないメモリ消費を試みる必要があります。

ウィンドウ化されたアプリケーションは、同様の一連のタスクを実行します。

  1. ウィンドウのクライアント領域で覆われるデスクトップの四角形を決定します。
  2. アダプターを列挙し、そのモニターがクライアント領域をカバーするアダプターを探します。 クライアント領域が複数のアダプターによって所有されている場合、アプリケーションは、各アダプターを個別に駆動するか、1 つのアダプターを駆動し、プレゼンテーションでデバイス間で Direct3D 転送ピクセルを持つことができます。 アプリケーションでは、上記の 2 つの手順を無視し、D3DADAPTER_DEFAULT アダプターを使用することもできます。 これにより、ウィンドウがセカンダリ モニターに配置されると、操作が遅くなる可能性があることに注意してください。
  3. アプリケーションは IDirect3D9::CheckDeviceTypeを呼び出して、デスクトップ モードで指定した形式のバック バッファーへのレンダリングをデバイスがサポートできるかどうかを判断する必要があります。 IDirect3D9::GetAdapterDisplayMode を使用して、次のコード例に示すように、デスクトップの表示形式を決定できます。
    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    // Use the current display mode.
    D3DDISPLAYMODE mode;
    
    if(FAILED(m_pD3D->GetAdapterDisplayMode(Device.m_uAdapter , &mode)))
        return E_FAIL;
    
    Params.BackBufferFormat = mode.Format;
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, Device.m_DevType, 
    Params.BackBufferFormat, Params.BackBufferFormat, FALSE)))
        return E_FAIL;
    

Direct3D デバイス