深度バッファー サポートのクエリ (Direct3D 9)
いずれの機能に関しても、アプリケーションが使用しているドライバーが、全種類の深度バッファーリングをサポートしているとは限りません。ドライバーの能力を必ず確認してください。ほとんどのドライバーは z ベースの深度バッファーリングをサポートしていますが、すべてのドライバーが w ベースの深度バッファーリングをサポートしているとは限りません。サポートされていないスキームを有効にしようとしても、ドライバーは失敗しません。ドライバーは、代わりに別の深度バッファーリング方法に頼ったり、ときには深度バッファーリングをまとめて無効にします。これによって極端な深度ソートのアーティファクトによってシーンがレンダリングされることがあります。
Direct3D デバイスを作成する前にアプリケーションが使用する表示デバイスについて Direct3D にクエリすることによって、深度バッファーの一般的なサポートを確認できます。Direct3D オブジェクトが深度バッファーリングをサポートしていることを報告した場合、この Direct3D オブジェクトから作成するハードウェア デバイスはいずれも z バッファーリングをサポートします。
深度バッファーリング サポートについてクエリするには、次のサンプル コードに示すように、IDirect3D9::CheckDeviceFormat メソッドを使用します。
// The following example assumes that pCaps is a valid pointer to an
// initialized D3DCAPS9 structure
if(FAILED(m_pD3D->CheckDeviceFormat(pCaps->AdapterOrdinal,
pCaps->DeviceType,
AdapterFormat,
D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE,
D3DFMT_D16)))
return E_FAIL;
IDirect3D9::CheckDeviceFormat では、そのデバイスの能力に基づいて作成するデバイスを選択できます。この場合、16 ビットの深度バッファーをサポートしないデバイスは拒否されます。
次のコード例では、IDirect3D9::CheckDepthStencilMatch を使用してレンダー ターゲットと互換性のある深度ステンシルを確定する方法を示しています。
// Reject devices that cannot create a render target of RTFormat while
// the back buffer is of RTFormat and the depth-stencil buffer is
// at least 8 bits of stencil
if(FAILED(m_pD3D->CheckDepthStencilMatch(pCaps->AdapterOrdinal,
pCaps->DeviceType,
AdapterFormat,
RTFormat,
D3DFMT_D24S8)))
return E_FAIL;
ドライバーが深度バッファーをサポートしていることがわかったら、w バッファーのサポートを確認できます。深度バッファーはすべてのソフトウェア ラスタライザーでサポートされていますが、w バッファーはリファレンス ラスタライザーのみでサポートされています。これは実際のアプリケーションでは使用に適していません。アプリケーションが使用しているデバイスの種類に関係なく、w ベースの深度バッファーリングを有効にする前に w バッファーのサポートを確認してください。
- デバイスを作成したら、IDirect3DDevice9::GetDeviceCaps メソッドを呼び出して初期化された D3DCAPS9 構造体を渡します。
- 呼び出しの後、LineCaps メンバーは、プリミティブのレンダリングに対するドライバーのサポートに関する情報を含みます。
- この構造の RasterCaps メンバーは D3DPRASTERCAPS_WBUFFER フラグを含み、ドライバーはそのプリミティブ タイプ対して w ベースの深度バッファーリングをサポートします。