次の方法で共有


従来の LVertex タイプ

従来の LVertex タイプ

ここでは、位置・ディフューズ色・スペキュラ色・テクスチャ座標を持つ頂点を初期化および使用するために必要なステップについて説明する。

最初のステップでは、次のサンプル コードに示すように、カスタム頂点タイプと柔軟な頂点フォーマット (FVF) を定義する。

struct LVertex
{
    FLOAT    x, y, z;
    D3DCOLOR specular, diffuse;
    FLOAT    tu, tv;
};

const DWORD VertexFVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE |
                         D3DFVF_SPECULAR | D3DFVF_TEX1 );

次のステップでは、IDirect3DDevice9::CreateVertexBuffer メソッドを呼び出して、4 つの頂点を収めるのに十分な領域を確保した頂点バッファを作成する。これを、次のサンプル コードに示す。

g_d3dDevice->CreateVertexBuffer( 4*sizeof(LVertex), VertexFVF, 
                 D3DUSAGE_WRITEONLY, D3DPOOL_DEFAULT, &pBigSquareVB);

次のステップでは、各頂点の値を処理する。これを、次のサンプル コードに示す。

LVertex * 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].diffuse  = 0xffff0000;
v[0].specular = 0xff00ff00;
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].diffuse  = 0xff00ff00;
v[1].specular = 0xff00ffff;
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].diffuse  = 0xffff00ff;
v[2].specular = 0xff000000;
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].diffuse  = 0xffffff00;
v[3].specular = 0xffff0000;
v[3].tu = 0.0f; v[3].tv = 0.0f;

pBigSquareVB->Unlock();

頂点バッファは初期化され、レンダリングする準備ができている。次のサンプル コードは、従来の FVF を使って正方形を描画する方法を示している。

g_d3dDevice->SetFVF( VertexFVF );
g_d3dDevice->SetStreamSource( 0, pBigSquareVB, 4*sizeof(LVertex) );
g_d3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0 ,2);

FVF を IDirect3DDevice9::SetFVF メソッドに渡して、従来の FVF と、ストリーム 0 だけが有効なストリームであることを指定している。