MFC架构下的DirectX8
2010-05-25 20:36:05 来源:WEB开发网第三章 画三角形
(DX8MFC2)
定义你的顶点格式,Direct3D引入了一种可变形顶点格式(flexible vertex format)(FVF)的概念。在FVF中,你定义一个结构其中包括所需要的顶点组成部分。这个结构会随着你的程序而改变,但在这里你将初步把它定义成这个样子:
struct MYVERTEX
{
FLOAT x, y, z; // The transformed position
FLOAT rhw; // 1.0 (reciprocal of homogeneous w)
DWORD color; // The vertex color
};
示例的开始定义了一个顶点结构,顶点的名称,和每一个三角形的顶点。在你的InitDirect3D函数中,你必须创建一个顶点缓冲区:
int num_elems = sizeof(vertices) / sizeof(vertices[0]);
pID3DDevice->CreateVertexBuffer(sizeof(MYVERTEX) *
num_elems,
D3DUSAGE_WRITEONLY,
D3DFVF_XYZRHW|D3DFVF_DIFFUSE,
D3DPOOL_DEFAULT,
&pStreamData);
函数的第一个参数是顶点结构的字节大小。在应用程序还不能读取顶点之前,传一个D3DUSAGE_WRITEONLY标记给它。这里可以有不同的标记来指定如何处理你的顶点,但现在你可以确信Direct3D已经能正确的工作了。
下一步,指定我们用的是什么FVF格式。当你还没有使用坐标系预转换之前,指定为D3DFVF_XYZRHW标记。以后你使用自己的矩阵坐标系转换时,把它改成D3DFVF_XYZ。D3DFVF_DIFFUSE告诉Direct3D,我们将为每一个顶点指定颜色。D3DPOOL_DEFAULT指定内存的管理模式。
最后一个参数是顶点缓冲区的指针,在例子1中你已经定义了它,但并没有用上。
如果你不向顶点缓冲区填入有用数据的话,顶点缓冲区是没有用的:
MYVERTEX *v;
pStreamData->Lock(0, 0, (BYTE**)&v, 0);
for(int ii = 0; ii < num_elems; ii++)
{
v[ii].x = vertices[ii].x;
v[ii].y = vertices[ii].y;
v[ii].z = vertices[ii].z;
v[ii].rhw = vertices[ii].rhw;
v[ii].color = vertices[ii].color;
}
pStreamData->Unlock();
这是不难理解的,Lock返回一个你想写入顶点数据的指针。下一步你从你的顶点阵列中拷贝数据。然后,反还这个指针。
这一对的调用可以告诉Direct3D你的FVF格式,并设定顶点阵列为当前的活动顶点阵列。(你可以有多个顶点阵列)。
pID3DDevice->SetVertexShader(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
pID3DDevice->SetStreamSource(0, pStreamData, sizeof(MYVERTEX));
SetVertexShader告诉Direct3D使用与CreateVertexBuffer同样的格式。
SetStreamSource告诉Direct3D使用pStreamData作为当前顶点阵列,并取得所有元素的大小。
你现在可以加入画三角形的代码了。在DrawScene()的BeginScene和EndScene之间加入如下代码:
int num_elems = sizeof(vertices) / sizeof(vertices[0]);
pID3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,
0,
num_elems / 3);
D3DPT_TRIANGLELIST标记将命令Direct3D画不连续的三角形。你指定从索引的第0个顶点开始,指定所要画的三角形数目。
如果正确的话,你会看到一个三角形画在先前的绿色背景窗口上。
更多精彩
赞助商链接