lor.
stD3DVertex objData[] =
{
{ 420.0f, 150.0f, 0.5f, col, },
{ 420.0f, 350.0f, 0.5f, col, },
{ 220.0f, 150.0f, 0.5f, col, },
{ 220.0f, 350.0f, 0.5f, col, },
};
// Create the vertex buffer.
if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), 0,
D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,
NULL))) return false;
// Fill the vertex buffer.
void *ptr;
if(FAILED(g_VertexBuffer->Lock(0, sizeof(objData),
(void**)&ptr, 0))) return false;
memcpy(ptr, objData, sizeof(objData));
g_VertexBuffer->Unlock();
return true;
}
InitializeObjects()函数开始先计算用于遮蔽线段的白色颜色值。宏D3DCOLOR_XRGB将以RGB(红、绿、蓝)格式指定的颜色值转换成Direct3D希望使用的格式。计算完颜色值后就创建了对象。为了创建两条线段,需要指定四个点。前两个点构成一条线段,后两个点构成另一条线段,并指定每个点的x、y、z坐标位置和颜色值。这和顶点结构以及顶点FVF完全符合。
计算完数据后,创建顶点缓存保存数据。调用CreateVertexBuffer()函数可以创建顶点缓存。该函数的参数包括要存储的对象大小、指定使用方式的标识符(其使用方式可以是D3DUSAGE枚举变量中的任意值)、描述顶点数据布局(D3DFVF_VERTEX)的顶点格式、可以是D3DPOOL枚举变量中任意值的池标识符(该标识符指定了内存中放置资源的正确位置),以及通过调用该函数创建的顶点缓存。最后一个参数为保留参数,通常设为NULL(空)。
一旦完成顶点缓存的分配,就将数据复制到顶点缓存中。首先,调用Lock()函数锁定顶点缓存。Lock()函数可以获取一个指向顶点缓存中已分配内存的指针,这样就可以操作该指针。Lock()函数的参数包括从0位置(该位置指定了内存的起始位置)开始的偏移值(单位:字节)、要用的字节数、指向包含顶点数据的内存的指针,以及锁定缓存时用的标识符(该参数值可以设为D3DLOCK_DISCARD、D3DLOCK_NO_DIRTY_UPDATE、D3DLOCK_NOSYSLOCK、D3DLOCK_READONLY或D3DLOCK_NOOVERWRITE)。如果要用的字节数设为0,表明指定的是全部缓存。
一旦得到一个指向内存的指针,就可以将数据复制到缓存中。在处理数组时,复制数据的最简单方法是使用memcpy()这个标准的C函数。这样就可以将全部数据复制到缓存中,并做好使用准备。调用Unlock()函数可以将顶点缓存设置为准备就绪。不可以使用锁定的顶点缓存,每调用一个Lock()函数就要调用一个对应的Unlock()函数。
一旦创建完顶点缓存,就可以将其渲染到屏幕上。调用演示程序中的RenderScene()函数可以完成渲染工作。在消息循环过程中,WinMain()将调用RenderScene()函数。如果在消息循环过程中没有处理任何消息,WinMain()就会调用RenderScene()函数用要显示的新内容来更新屏幕。因为这里没有动画,所以和要显示的动画帧没有差别。源文件中的最后两个函数是RenderScene()和Shutdown()。这两个函数的代码如下所示。
Lines演示程序的RenderScene()和Shutdown()函数的源代码:
[cpp]
void RenderScene()
{
// Clear the backbuffer.
g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
// Begin the scene. Start rendering.
g_D3DDevice->BeginScene();
// Render object.
g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0,
sizeof(stD3DVertex));
g_D3DDevice->SetFVF(D3DFVF_VERTEX);
g_D3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, 2);
// End the scene. Stop rendering.
g_D3DDevice->EndScene();
// Display the scene.
g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}
void Shutdown()
{
if(g_D3DDevice != NULL) g_D3DDevice->Release();
if(g_D3D != NULL) g_D3D->Release();
if(g_VertexBuffer != NULL) g_VertexBuffer->Release();
g_D3DDevice = NULL;
g_D3D = NULL;
g_VertexBuffer = NULL;
}
void RenderScene()
{
// Clear the backbuffer.
g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
// Begin the scene. Start rendering.
g_D3DDevice->BeginScene();
// Render object.
g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0,
sizeof(stD3DVertex));
g_D3DDevice->SetFVF(D3DFVF_VERTEX);
g_D3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, 2);
// End the scene. Stop rendering.
g_D3DDevice->EndScene();
// Display the scene.
g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}
void Shutdown()
{
if(g_D3DDevice != NULL) g_D3DDevice->Release();
if(g_D3D != NULL) g_D3D->Release();
if(g_VertexBuffer != NULL) g_VertexBuffer->Release();
g_D3DDevice = NULL;
g_D3D = NULL;
g_VertexBuffer = NULL;
}
Shutdown()函数对顶点缓存增加了一个释放调用,前面对界面和设备对象已经做过这样的处理。RenderScene()函数除了在BeginScene()和EndScene(