Microsoft DirectX 8.0 (C++)

デバイスの選択

アプリケーションは、サポートされている Microsoft® Direct3D® デバイス タイプをハードウェアに照会して検出できる。ここでは、ディスプレイ アダプタの列挙と Direct3D デバイスの選択に関わる基本タスクについて説明する。

アプリケーションは、適切な Direct3D デバイスを選択するための一連のタスクを実行する必要がある。以下のステップは、フルスクリーン アプリケーションのタスクである。多くの場合、ウィンドウ アプリケーションではこれらのステップの大部分を省略できる。

  1. 最初に、アプリケーションはシステム上のディスプレイ アダプタを列挙する必要がある。アダプタは、ハードウェアの物理的部品である。デュアル ヘッド ディスプレイの場合と同様、グラフィックス カードに複数のアダプタが搭載されている場合もあるので注意すること。マルチモニタ サポートに関連しないアプリケーションでは、このステップを無視し、ステップ 2 で IDirect3D8::EnumAdapterModes メソッドに D3DADAPTER_DEFAULT を渡す。
  2. アプリケーションは、アダプタごとに EnumAdapterModes を呼び出して、そのアダプタがサポートするディスプレイ モードを列挙する。
  3. 必要に応じて、IDirect3D8::CheckDeviceType を呼び出し、列挙された各ディスプレイ モードにハードウェア アクセラレーションが存在するかどうかをチェックする。これについては、次のコードに示す。これは CheckDeviceType で使用できる方法の 1 つにすぎない。詳細については、「ハードウェア サポートの判定」を参照すること。
    D3DPRESENT_PARAMETERS Params;
    // D3DPRESENT_PARAMETERS メンバの値を初期化する。 
    
    Params.BackBufferFormat = D3DFMT_X1R5G5B5; 
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, 
                                      Device.m_DevType, 
                                      Params.BackBufferFormat, Params.BackBufferFormat, 
                                      FALSE))) 
            return E_FAIL;
    
  4. アプリケーションは IDirect3D8::GetDeviceCaps メソッドを呼び出し、このアダプタのデバイスに必要なレベルの能力があるかチェックする。このメソッドによって、必要な能力をサポートしていないデバイスが選択対象から外される。GetDeviceCaps によって返されるデバイス能力は、CheckDeviceType で検証されたすべてのディスプレイ モードにおいて、デバイスごとに一定であることが保証されている。
  5. デバイスは常に、そのデバイスがサポートするフォーマットとして列挙されたディスプレイ モードのフォーマットを持つサーフェスにレンダリングする。異なるフォーマットのサーフェスにレンダリングする場合は、IDirect3D8::CheckDeviceFormat を呼び出す。デバイスがそのフォーマットにレンダリングできる場合は、GetDeviceCaps が返すすべての能力が適用可能であることが保証される。
  6. 最後に、IDirect3D8::CheckDeviceMultiSampleType メソッドを使って、レンダリング フォーマットでフルシーン アンチエイリアシングなどのマルチサンプリング テクニックがサポートされているかどうかを判定できる。

上記のステップを完了すると、アプリケーションでは、処理できるディスプレイ モードのリストが完成する。最後のステップでは、デバイスがアクセス可能なメモリに、必要な数のバッファとアンチエイリアシングを確保できるスペースがあるかどうかを検証する。このテストを必要とする理由は、モードとマルチサンプルの組み合わせによって消費されるメモリ量が、実際に検証する以外の方法では予測不可能だからである。さらに、ディスプレイ アダプタのアーキテクチャによっては、一定量のデバイス アクセス可能なメモリが用意されていないことがある。つまり、フルスクリーン モードに移行するときにビデオ メモリ障害が発生した場合は、アプリケーションがレポートする必要がある。一般には、アプリケーションがユーザーに提供するモード リストからフルスクリーン モードを削除するか、または使用するバック バッファの数を少なくしたり、メモリ消費の少ないマルチサンプル テクニックを使用して、メモリ消費量の削減を図る。

ウィンドウ アプリケーションでも同様の一連のタスクを実行する。

  1. ウィンドウのクライアント領域に合うデスクトップ矩形を決定する。
  2. アダプタを列挙し、クライアント領域に合うモニタを使用するアダプタを探す。クライアント領域が複数のアダプタによって所有されている場合は、各アダプタを個別に駆動する方法か、1 つのアダプタを駆動して、プレゼンテーション時には Direct3D によってデバイスからデバイスにピクセルを転送する方法かを選択できる。また前述の 2 つのステップを無視して、D3DADAPTER_DEFAULT をアダプタを使用する方法もある。この方法では、ウィンドウがセカンダリ モニタ上に配置されると処理速度が遅くなる場合がある。
  3. アプリケーションは、デスクトップ モード中に CheckDeviceType を呼び出して、デバイスが指定されたフォーマットのバック バッファへのレンダリングをサポートできるかどうかを判定しなければならない。次のコードに示すように、IDirect3D8::GetAdapterDisplayMode を使用して、デスクトップのディスプレイ フォーマットを判定することができる。
    D3DPRESENT_PARAMETERS Params;
    // D3DPRESENT_PARAMETERS メンバの値を初期化する。 
    
    // 現在のディスプレイ モードを使用する。
    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;