Platform SDK: DirectX |
ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「Direct3D 直接モードの C/C++ チュートリアル」を参照すること。
レンダリング デバイスが深度バッファをサポートしている場合、深度バッファの作成前に、どのような深度バッファ フォーマットをサポートしているかを確認しておかなければならない。Direct3D7.GetEnumZBufferFormats メソッドを呼び出して、デバイスがサポートしている深度バッファ フォーマットを列挙する。サンプル ZBuffer では、次のコードを使用して、深度バッファ フォーマットを列挙している。
' バックバッファの作成後、Direct3D デバイスを作成する前に、 ' z バッファを作成する。注 :z バッファの作成前に、アプリケーションが、 ' D3DPRASTERCAPS_ZBUFFERLESSHSR フラグでデバイス能力をチェックする場合がある。このフラグは、 ' z バッファなしに、HSR (hidden-surface-removal) を行うことができるハードウェアに対して真になる。 ' そうしたデバイスに対しては、z バッファを作成する必要はない。 ' Dim ddpfZBuffer As DDPIXELFORMAT Dim d3dEnumPFs As Direct3DEnumPixelFormats Set g_d3d = g_dd.GetDirect3D Set d3dEnumPFs = g_d3d.GetEnumZBufferFormats("IID_IDirect3DRGBDevice")
GetEnumZBufferFormats メソッドは、フォーマットを列挙する対象となるデバイスのグローバル ユニーク識別子 (GUID) を受け付ける。ZBuffer アプリケーションでは、GUID をコード中に書き込んで使用しているが、実際のアプリケーションでは、レンダリング デバイスの GUID を確認するテスト メカニズム、IID_IDirect3DRGBDevice または IID_IDirect3DHALDevice のいずれかを実装する。
ここで、デバイスのフォーマットが列挙されるので、サポートされる深度バッファ フォーマットを確認できる。
Dim I As Long For I = 1 To d3dEnumPFs.GetCount() Call d3dEnumPFs.GetItem(I, ddpfZBuffer) If ddpfZBuffer.lFlags = DDPF_ZBUFFER Then Exit For End If Next I
Direct3DEnumPixelFormats.GetItem を呼び出すと、2 番目の引数によって、深度バッファのピクセル フォーマットを示す DDPIXELFORMAT 型を渡す。メンバ IFlags には、深度バッファ ビットを含む任意のピクセル フォーマットに対して DDPF_ZBUFFER が格納される。最初の引数によって、GetItem は列挙されたフォーマットにインデックスを作成する。適切なフォーマットが見つかった場合、GetItem はそのピクセル フォーマットを ddpfZBuffer パラメータ、DDPIXELFORMAT 型に保存し、ループが終了する。
このチュートリアルでは、理解しやすくするため、最も一般的なタイプの深度バッファである z バッファだけを使用している。システムが列挙するほかのフォーマット (DDPF_STENCILBUFFER など) は、すべて無視する。アプリケーションは、z バッファのビット深度 (8、16、24、32 ビット) をチェックして、ビット深度に基づいた選択を行うこともできる。
深度バッファのフォーマットを決定すると、そのフォーマットを使用する DirectDrawSurface を作成することができる。これが、「ステップ 2 : 深度バッファを作成する」の説明内容である。