Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「Direct3D 直接モード Visual Basic チュートリアル」を参照すること。
ここで、深度バッファ フォーマットの選択を終了したので、深度バッファとなる 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 : 深度バッファをアタッチする」で説明する。