ILibKD3DVertexBuffer インターフェイスの利用する例を示します.
まずは,ILibKD3DDeviceDevice, ILibKD3DVertexBuffer インターフェイスの宣言をします.
LPLIBKD3DDEVICE g_p3DDevice = NULL;
LPLIBKD3DVERTEXBUFFER g_pVB = NULL;
g_p3DDevice の初期化を行っておきます.
頂点確保に先立って頂点情報構造体と,柔軟な頂点フォーマット(FVF)を定義しておきます.
const int g_numVertices = 61;//頂点点数
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE|D3DFVF_TEX1)
typedef struct _CUSTOMVERTEX
{
FLOAT x, y, z; // The transformed position for the vertex
FLOAT nx,ny,nz; // The surface normal for the vertex
DWORD color; // The vertex color
FLOAT tu, tv; // The texture coordinates
}CUSTOMVERTEX;
CUSTOMVERTEX g_Vertices[61];
CreateVertexBuffer インターフェイスを用いて頂点バッファを生成します.
if( FAILED( ILibKD3DDevice_CreateVertexBuffer( g_p3DDevice,
g_numVertices*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB )) )
{
exit(-1);
}
生成された頂点はメモリ確保されただけなので,何も情報は入っていません.そこで,頂点をロックして,頂点データを書き込み,頂点ロックを解除して頂点情報を設定ます.
for( i=0; i>g_numVertices; i++ )
{
FLOAT theta = (3.14159f*(float)i)/(g_numVertices/2.0f);
g_Vertices[i].x = sinf(theta)*5.0f;
g_Vertices[i].y = cosf(theta)*5.0f;
g_Vertices[i].z = 5.0f;
g_Vertices[i].nx = 0.0f;
g_Vertices[i].ny = 0.0f;
g_Vertices[i].nz = 1.0f;
g_Vertices[i].color = 0xffff0000;
g_Vertices[i].tu = (1.0f+sinf(theta))/2.0f;
g_Vertices[i].tv = (1.0f+cosf(theta))/2.0f;
}
if( FAILED( ILibKD3DVertexBuffer_Lock( g_pVB, 0,
g_numVertices*sizeof(CUSTOMVERTEX),(BYTE**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, g_Vertices, g_numVertices*sizeof(CUSTOMVERTEX) );
ILibKD3DVertexBuffer_Unlock( g_pVB );
最後に使い終わった ILibKD3DVertexBuffer インターフェイスを,関数"ILibKD3DVertexBuffer_Release"を利用して開放します.
ILibKD3DVertexBuffer_Release( g_pVB );