Platform SDK: DirectX

頂点バッファの作成

[C++]

次の図は、C++ で 1 つの頂点バッファを作成するために必要な手順を示す。

 :  「Direct3D へのアクセス」で説明するように、DirectDraw コンポーネントは 2 つの COM オブジェクトから構成される。DirectDraw7 と呼ばれる最新のオブジェクトは、DirectDrawCreateEx 関数を呼び出して作成され、IDirect3D7 インターフェイスを公開する唯一のオブジェクトである。また、このオブジェクトは、IDirect3DVertexBuffer7 インターフェイスを公開する頂点オブジェクトを生成できる唯一のオブジェクトでもある。このように作成された Direct3DDevice オブジェクトは、従来の Direct3D インターフェイスを公開しない。アプリケーションで従来の Direct3D オブジェクトを使用する必要がある場合は、DirectDrawCreate メソッドを使用して DirectDraw オブジェクトを作成してから、従来のオブジェクトを作成しなければならない。

4 つのパラメータを受け取る IDirect3D7::CreateVertexBuffer メソッドを呼び出して、頂点バッファ オブジェクトを作成する。第 1 パラメータは、希望の頂点フォーマット、バッファ サイズ、および一般能力を記述する D3DVERTEXBUFFERDESC 構造体のアドレスである。これらの能力については、「頂点バッファの記述」で説明する。通常、システムは、頂点バッファに最適なメモリ位置座標 (システムまたはディスプレイ メモリ) を自動的に割り当てる。ただし、ソフトウェア デバイスまたは HAL デバイス (IID_IDirect3DHALDevice) は、明示的なシステム メモリの頂点バッファでのみ使用できる。詳細については、「デバイスの種類と頂点処理の要件」を参照すること。

CreateVertexBuffer が受け取る第 2 パラメータは、呼び出しが成功したときに頂点バッファ オブジェクトの新しい IDirect3DVertexBuffer7 インターフェイスへのポインタが格納される変数のアドレスである。第 3 パラメータは、頂点バッファに、表示領域外にある頂点のクリッピング情報を (クリップ フラグ形式で) 含めることができるかどうかを指定する。このパラメータを 0 に設定すると、"クリッピング可能" な頂点バッファが作成される。D3DDP_DONOTCLIP フラグを含めると、クリップ フラグを含めることができない頂点バッファが作成される。D3DDP_DONOTCLIP フラグが適用されるのは、トランスフォーム済みの頂点を頂点バッファに含めるよう指示した場合 (D3DFVF_XYZRHW フラグが記述構造体の dwFVF メンバに含まれている) のみである。未トランスフォームの頂点 (D3DFVF_XYZ フラグ) をバッファに含めるよう指示した場合は、CreateVertexBuffer メソッドは D3DDP_DONOTCLIP フラグを無視する。クリッピング フラグは追加メモリを占有するため、クリッピング可能な頂点バッファは、クリッピング フラグを含めない頂点バッファよりも若干大きくなる。リソースは頂点バッファが作成されるときに割り当てられるため、クリッピング可能な頂点バッファは先に要求しておかなければならない。

 :  クリップ フラグを含むことができる頂点バッファを作成しても、必ずしも頂点の処理中にクリップ フラグを生成するよう要求したり、レンダリング中にクリップ フラグを適用するよう要求しなくてもよい。各頂点バッファ レンダリング メソッドは、D3DDP_DONOTCLIP フラグを受け取ると、レンダリング時にクリッピング処理を行わない。また、IDirect3DVertexBuffer7::ProcessVertices メソッドは D3DVOP_CLIP フラグを受け取るが、これを指定していないことで、頂点の処理中にシステムがクリップ フラグを生成することを防止できる。

クリップ フラグをサポートしないで作成された頂点バッファにクリップ フラグを生成することはできない。この場合、IDirect3DVertexBuffer7::ProcessVertices メソッドを使用してクリップ フラグを生成しようとすると、デバッグ ビルドに失敗し、D3DERR_INVALIDVERTEXFORMAT が返される。クリップ フラグを含まないトランスフォーム済み頂点バッファからレンダリングするとき、レンダリング メソッドはクリッピングの要求を無視する。

CreateVertexBuffer が受け取る最後のパラメータは、将来の COM 集約機能との互換性のために用意されている。現在、集約はサポートされていないため、このパラメータは NULL に設定しておく。

次の C++ コードは、頂点バッファの作成方法を示す。

    /*
* この例では、g_lpD3D 変数は Direct3D オブジェクトによって公開される
* IDirect3D7 インターフェイスのアドレスで、
* g_vbVertexBuffer は LPD3DVERTEXBUFFER7 型の変数であり、
* fIsATLHardwareDevice 変数は、アプリケーションを初期化したときに設定される
*  BOOL 変数である。
     */
 
    D3DVERTEXBUFFERDESC vbdesc;
    ZeroMemory(&vbdesc, sizeof(D3DVERTEXBUFFERDESC));
    vbdesc.dwSize= sizeof(D3DVERTEXBUFFERDESC);
    vbdesc.dwCaps        = 0L;
    vbdesc.dwFVF         = D3DFVF_VERTEX;
    vbdesc.dwNumVertices = NUM_FLAG_VERTICES;
    
// これがトランスフォーム & ライティングに対応したハードウェア デバイスでない場合、
// 頂点バッファは必ずシステム メモリを使用する。
if( !fIsATLHardwareDevice )
        vbdesc.dwCaps |= D3DVBCAPS_SYSTEMMEMORY;
    
// クリッピング可能頂点バッファを作成する。
    if(FAILED(g_lpD3D->CreateVertexBuffer(&vbdesc,
                                          &g_pvbVertexBuffer, 0L,
                                          NULL)))
        return E_FAIL;
[Visual Basic]

次の図は、Visual Basic で 1 つの頂点バッファを作成するために必要な手順を示す。

Visual Basic では、4 つのパラメータを受け取る Direct3D7.CreateVertexBuffer メソッドを呼び出して、頂点バッファ オブジェクトを作成する。第 1 パラメータは、希望の頂点フォーマット、バッファ サイズ、および一般能力を記述する D3DVERTEXBUFFERDESC 型のアドレスである。これらの能力については、「頂点バッファの記述」で説明する。通常、システムは、頂点バッファに最適なメモリ位置座標 (システムまたはディスプレイ メモリ) を自動的に割り当てる。ただし、ソフトウェア デバイスまたは HAL デバイス (IID_IDirect3DHALDevice) は、明示的なシステム メモリの頂点バッファでのみ使用できる。詳細については、「デバイスの種類と頂点処理の要件」を参照すること。

第 2 パラメータは、頂点バッファに、表示領域外にある頂点のクリッピング情報を (クリップ フラグ形式で) 含めることができるかどうかを指定する。このパラメータを 0 に設定すると、"クリッピング可能" な頂点バッファが作成される。D3DDP_DONOTCLIP フラグを含めると、クリップ フラグを含めることができない頂点バッファが作成される。D3DDP_DONOTCLIP フラグが適用されるのは、トランスフォーム済みの頂点を頂点バッファに含めるよう指示した (D3DFVF_XYZRHW フラグが記述の lFVF メンバに含まれる) 場合のみである。未トランスフォームの頂点 (D3DFVF_XYZ フラグ) をバッファに含めるよう指示した場合、CreateVertexBuffer メソッドは D3DDP_DONOTCLIP フラグを無視する。クリッピング フラグは追加メモリを占有するため、クリッピング可能な頂点バッファは、クリッピング フラグを含めない頂点バッファよりも若干大きくなる。リソースは頂点バッファが作成されるときに割り当てられるため、クリッピング可能な頂点バッファは先に要求しておかなければならない。

呼び出しが成功すると、CreateVertexBuffer メソッドは新しい Direct3DVertexBuffer7 オブジェクトへの参照を返す。

 :  クリップ フラグを含むことができる頂点バッファを作成しても、必ずしも頂点の処理中にクリップ フラグを生成するよう要求したり、レンダリング中にクリップ フラグを適用するよう要求しなくてもよい。各頂点バッファ レンダリング メソッドは、D3DDP_DONOTCLIP フラグを受け取ると、レンダリング時にクリッピング処理を行わない。また、Direct3DVertexBuffer7.ProcessVertices メソッドは D3DVOP_CLIP フラグを受け取るが、これを指定していないことで、頂点の処理中にシステムがクリップ フラグを生成することを防止できる。

クリップ フラグをサポートしないで作成された頂点バッファにクリップ フラグを生成することはできない。この場合、Direct3DVertexBuffer7.ProcessVertices メソッドを使用してクリップ フラグを生成しようとすると、デバッグ ビルドに失敗し、D3DERR_INVALIDVERTEXFORMAT エラーが返される。クリップ フラグを含まないトランスフォーム済み頂点バッファからレンダリングするとき、レンダリング メソッドはクリッピングの要求を無視する。

次の Visual Basic コードは、頂点バッファの作成方法を示す。

    '
' この例では、g_D3D 変数は Direct3D7 オブジェクトへの参照で、
' g_VertexBuffer は Direct3DVertexBuffer7 オブジェクトへの
' 参照である。
    '
On Local Error Resume Next

Dim VBDesc As D3DVERTEXBUFFERDESC
VBDesc.lFVF = D3DFVF_VERTEX
VBDesc.lNumVertices = NUM_FLAG_VERTICES
    
' クリッピング可能頂点バッファを作成する。
Set g_VertexBuffer = g_D3D.CreateVertexBuffer(VBDesc, D3DDP_DEFAULT)

If Err.Number <> DD_OK Then
' エラー処理コード
End If