Platform SDK: DirectX

ステップ 2 : 深度バッファを作成する

[Visual Basic]

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

[C++]

ここで、深度バッファ フォーマットの選択を終了したので、深度バッファとなる DirectDrawSurface オブジェクトを作成することができる。サーフェスのピクセル フォーマットは、列挙によって決定されたものであるが、サーフェスの寸法は、アタッチされるレンダリング ターゲット サーフェスと同一にしなければならない。サンプル ZBuffer では、このタスクに対して次のコードを使用する。

    // 適切な Z バッファ フォーマットが見つかると、
    // 列挙中に dwSize フィールドが正しく設定される。適切な Z バッファ フォーマットが見つからなかった場合は、問題があるため終了する。
    if( sizeof(DDPIXELFORMAT) != ddpfZBuffer.dwSize )
        return E_FAIL;
 
    // レンダリング ターゲットから z バッファのサイズを取得する。
    // z バッファのサーフェス記述をセット アップする。
    ddsd.dwFlags        = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_ZBUFFER;
    ddsd.dwWidth        = g_rcScreenRect.right - g_rcScreenRect.left;
    ddsd.dwHeight       = g_rcScreenRect.bottom - g_rcScreenRect.top;
    memcpy( &ddsd.ddpfPixelFormat, &ddpfZBuffer, sizeof(DDPIXELFORMAT) );
 
    // ハードウェア デバイスの場合、Z バッファをビデオ メモリ内に作成しなければならない。ソフトウェア デバイスの場合は、
    // Z バッファをシステム メモリ内に作成する。
    if( IsEqualIID( *pDeviceGUID, IID_IDirect3DHALDevice ) )
        ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY;
    else
        ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
 
    // Z バッファを作成してアタッチする。実際のアプリケーションでは、
    // ここでエラー処理を行う (DDERR_OUTOFVIDEOMEMORY が発生する場合がある)。ただし、
    // このチュートリアルでは、このエラー処理を行わずに終了する。
    if( FAILED( hr = g_pDD->CreateSurface( &ddsd, &g_pddsZBuffer, NULL ) ) )
        return hr;

上記のコードは、設定済みのグローバル変数から計算されたレンダリング ターゲット サーフェスの寸法を使用して、深度バッファ用の DDSURFACEDESC2 構造体を準備しているだけである。前のステップ「ステップ 1 : 深度バッファ フォーマットを列挙する」で取得したピクセル フォーマット情報は、サーフェス記述にコピーされる。

注 :  ハードウェア デバイスでは、深度バッファをメモリ内でのその位置に関係なく使用できる。ハードウェア デバイスの使用時には、サーフェス能力フラグ DDSCAPS_VIDEOMEMORY および DDSCAPS_SYSTEMMEMORY を省略して、バッファの最適位置をデバイスに決定させるのが最善である。しかし、ソフトウェア デバイスは、深度バッファがシステム メモリに存在しないと、作成することができない。上記のコードでは、ソフトウェア デバイスである可能性をチェックして、必要に応じて DDSCAPS_SYSTEMMEMORY フラグを含めるようにしている。

サーフェス記述の準備ができると、このコードでは、IDirectDraw7::CreateSurface メソッドを呼び出して新しい深度バッファ サーフェスを作成する。深度バッファを作成した後、その深度バッファをレンダリング ターゲットとして使用されるサーフェスにアタッチできる。この処理については、「ステップ 3 : 深度バッファをアタッチする」で説明する。