Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「Direct3D 直接モード Visual Basic チュートリアル」を参照すること。
レンダリング デバイスが深度バッファをサポートしているのであれば、深度バッファの作成前に、どのような深度バッファ フォーマットをサポートしているかを確認しておかなければならない。IDirect3D7::EnumZBufferFormats メソッドを呼び出して、デバイスでサポートしている深度バッファ フォーマットを列挙する。サンプル ZBuffer では、次のコードを使用して、深度バッファ フォーマットを列挙している。
//------------------------------------------------------------------------- // バックバッファを作成してから d3ddevice を作成するまでに // Z バッファを作成する。 // // 注 : Z バッファの作成前に、アプリケーションでは、 // D3DPRASTERCAPS_ZBUFFERLESSHSR フラグのデバイス能力をチェックする場合もある。 // フラグは、z バッファなしに、HSR (hidden-surface-removal) を // 行うことができるハードウェアに対して TRUE になる。そうしたデバイスに対しては、z バッファを作成する必要はない。 //------------------------------------------------------------------------- DDPIXELFORMAT ddpfZBuffer; g_pD3D->EnumZBufferFormats( *pDeviceGUID, EnumZBufferCallback, (VOID*)&ddpfZBuffer );
EnumZBufferFormats メソッドは、フォーマットを列挙する対象となるデバイスのグローバル ユニーク識別子 (GUID)、コールバック関数のアドレス、およびコールバック関数に渡される任意のデータ構造体のアドレスを受け付ける。ユーザーが提供するコールバック関数は、D3DEnumPixelFormatsCallback 関数プロトタイプに従わなければならない。システムは、コールバック関数が D3DENUMRET_CANCEL を返さない限り、指定されたコールバック関数を、サポートされている各深度バッファ フォーマットに対して一度ずつ呼び出す。サンプル ZBuffer は、次のようなコールバック関数を処理する。
static HRESULT WINAPI EnumZBufferCallback( DDPIXELFORMAT* pddpf, VOID* pddpfDesired ) { // このチュートリアルでの対象は Z バッファのみで、 // ほかのフォーマット (DDPF_STENCILBUFFER など) が列挙されてもすべて無視する。また、 // アプリケーションでは、Z バッファの深度 (16 ビットなど) を調べ、 // その結果に基づいて選択することもできる。このチュートリアルでは、最初に列挙された // フォーマットを選択する。 if( pddpf->dwFlags == DDPF_ZBUFFER ) { memcpy( pddpfDesired, pddpf, sizeof(DDPIXELFORMAT) ); // D3DENUMRET_CANCEL を返して検索を終了する。 return D3DENUMRET_CANCEL; } // D3DENUMRET_OK を返して検索を続行する。 return D3DENUMRET_OK; }
システムがこのコールバック関数を呼び出すときには、深度バッファのピクセル フォーマットを記述する DDPIXELFORMAT 構造体のアドレスを渡す。dwFlags メンバには、深度バッファ ビットを含む任意のピクセル フォーマットに対して DDPF_ZBUFFER が格納される。その場合、dwZBufferBitDepth メンバに深度情報に予約されているピクセル フォーマット中のビット数を表す整数が格納され、dwZBitMask メンバが関連ビットをマスクする。
このチュートリアルでは、理解しやすくするため、最も一般的なタイプの深度バッファである z バッファだけを使用している。システムが列挙するほかのフォーマット (DDPF_STENCILBUFFER など) は、すべて無視する。アプリケーションは、z バッファのビット深度 (8、16、24、32 ビット) をチェックして、ビット深度に基づいた選択を行うこともできる。適切なフォーマットが見つかると、このコールバック関数は、与えられた DDPIXELFORMAT 構造体を 2 番目のパラメータで渡されたアドレス (これも、DDPIXELFORMAT 構造体) にコピーし、列挙を終了させるため D3DENUMRET_CANCEL を返す。
深度バッファのフォーマットを決定すると、そのフォーマットを使用する DirectDrawSurface を作成することができる。これが、「ステップ 2 : 深度バッファを作成する」の説明内容である。