Microsoft DirectX 8.0 (C++)

深度バッファのサポート状況の問い合わせ

ほかの機能でも同様だが、アプリケーションで使用するドライバがあらゆる種類の深度バッファリングをサポートしているとは限らない。常にドライバの機能を調べる必要がある。z ベースの深度バッファリングはほとんどのデバイスでサポートされているが、w ベースの深度バッファリングは一部のデバイスでしかサポートされていない。サポートされていないスキームを有効にしても、ドライバは失敗しない。ドライバは別の深度バッファリングに頼ったり、場合によってはすべての深度バッファリングを無効にし、その結果、レンダリング後のシーンに深度ソートによる不自然な効果が現れることがある。

Direct3D デバイスを作成する前にアプリケーションで使用するディスプレイ デバイスについて Microsoft® Direct3D® に問い合わせることで、深度バッファのサポートを調べることができる。Direct3D オブジェクトから深度バッファリングをサポートしているとの報告があれば、この Direct3D オブジェクトから作成するハードウェア デバイスは z バッファリングをサポートする。

C++ アプリケーションで一般的な深度バッファリングのサポート状況を照会するには

深度バッファリングのサポート状況を問い合わせるには、IDirect3D8::CheckDeviceFormat メソッドを使用する。次のコードは、その例を示している。

// 次の例では、pCaps は初期化された D3DCAPS8 構造体への
// 有効なポインタであると仮定している。
    if( FAILED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, 
                                           pCaps->DeviceType, Format, 
                                           D3DUSAGE_DEPTHSTENCIL, 
                                           D3DRTYPE_SURFACE,
                                           D3DFMT_D16 ) ) )
        return E_FAIL;

CheckDeviceFormat では、該当するデバイスの能力に基づいて、作成するデバイスを選択できる。この場合、16 ビットの深度バッファをサポートしないデバイスは拒否される。

また、IDirect3D8::CheckDepthStencilMatch を使用して、サポートされている深度ステンシル フォーマットがディスプレイ モードでレンダリング ターゲットのフォーマットと互換性があるかどうか、特に、深度フォーマットがレンダリング ターゲットのフォーマットと等しいかどうかを調べることができる。

次のコードに示すように、CheckDepthStencilMatch を使用して、深度ステンシルがレンダリング ターゲットと互換性があるかどうかを調べる。

// バック バッファが RTF フォーマットで、
// 深度ステンシル バッファが少なくとも 8 ビットのステンシルである一方で、
// RTF フォーマットのレンダリング ターゲットを作成できないデバイスは拒否する。
if( FAILED( m_pD3D->CheckDepthStencilMatch( pCaps->AdapterOrdinal,
                                            pCaps->DeviceType, 
                                            AdapterFormat, 
                                            RTFormat, 
                                            D3DFMT_D24S8 ) ) )
        return E_FAIL;

ドライバで深度バッファがサポートされていることがわかったら、次は w バッファのサポート状況を調べることができる。深度バッファはすべてのソフトウェア ラスタライザでサポートされているが、w バッファはリファレンス ラスタライザでしかサポートされていない。これでは、実際のアプリケーションでの使用に適さない。アプリケーションで使用するデバイスがどのような種類でも、w ベース深度バッファリングを有効にする前に、w バッファのサポート状況を調べる必要がある。

C++ アプリケーションで w バッファのサポート状況を調べるには

  1. デバイスを作成した後、IDirect3DDevice8::GetDeviceCaps メソッドを呼び出して、初期化した D3DCAPS8 構造体を渡す。
  2. この呼び出しの後、プリミティブのレンダリングに関するドライバのサポートの情報が LineCaps メンバに入る。
  3. この構造体の RasterCaps メンバに D3DPRASTERCAPS_WBUFFER フラグが含まれている場合、ドライバは当該のプリミティブ タイプに対する W 深度バッファリングをサポートする。

深度バッファリングの一般情報については、「深度バッファとは」を参照すること。