Platform SDK: DirectX

ステップ 1 : 深度バッファ フォーマットを列挙する

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「Direct3D 直接モード Visual Basic チュートリアル」を参照すること。

[C++]

レンダリング デバイスが深度バッファをサポートしているのであれば、深度バッファの作成前に、どのような深度バッファ フォーマットをサポートしているかを確認しておかなければならない。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 : 深度バッファを作成する」の説明内容である。