Microsoft DirectX 8.0 (C++) |
ここでは、位置、法線、およびテクスチャ座標を持つ頂点を初期化および使用するために必要なステップについて説明する。
最初のステップでは、次のサンプル コードに示すように、カスタム頂点タイプと FVF を定義する。
struct Vertex { FLOAT x, y, z; FLOAT nx, ny, nz; FLOAT tu, tv; }; const DWORD VertexFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 );
次のステップでは、IDirect3DDevice8::CreateVertexBuffer メソッドを呼び出して、4 つの頂点を収めるのに十分な領域を確保した頂点バッファを作成する。これを、次のサンプル コードに示す。
g_d3dDevice->CreateVertexBuffer( 4*sizeof(Vertex), VertexFVF, D3DUSAGE_WRITEONLY, D3DPOOL_DEFAULT, &pBigSquareVB);
次のステップでは、各頂点の値を処理する。これを、次のサンプル コードに示す。
Vertex * v; pBigSquareVB->Lock( 0, 0, (BYTE**)&v, 0 ); v[0].x = 0.0f; v[0].y = 10.0; v[0].z = 10.0f; v[0].nx = 0.0f; v[0].ny = 1.0f; v[0].nz = 0.0f; v[0].tu = 0.0f; v[0].tv = 0.0f; v[1].x = 0.0f; v[1].y = 0.0f; v[1].z = 10.0f; v[1].nx = 0.0f; v[1].ny = 1.0f; v[1].nz = 0.0f; v[1].tu = 0.0f; v[1].tv = 0.0f; v[2].x = 10.0f; v[2].y = 10.0f; v[2].z = 10.0f; v[2].nx = 0.0f; v[2].ny = 1.0f; v[2].nz = 0.0f; v[2].tu = 0.0f; v[2].tv = 0.0f; v[3].x = 0.0f; v[3].y = 10.0f; v[3].z = 10.0f; v[3].nx = 0.0f; v[3].ny = 1.0f; v[3].nz = 0.0f; v[3].tu = 0.0f; v[3].tv = 0.0f; pBigSquareVB->Unlock();
頂点バッファは初期化され、レンダリングする準備ができている。次のサンプル コードは、レガシ FVF を使用して正方形を描画する方法を示している。
g_d3dDevice->SetVertexShader( VertexFVF ); g_d3dDevice->SetStreamSource( 0, pBigSquareVB, 4*sizeof(Vertex) ); g_d3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0 ,2);
FVF を IDirect3DDevice8::SetVertexShader メソッドに渡して、レガシ FVF が使用されること、およびストリーム 0 だけが有効なストリームであることを Direct3D に指示する。