} while(0);
return hr;
}
clear会填充你指定的缓冲区。你可以填充z缓冲区、后台缓冲区或摸板缓冲区(stencil buffer)。在这个例子中你将用绿色填充后台缓冲区。所以,我们设定d3dclear_target标志和绿色。
在本例中beginscene和endscene并没有做什么,但在以后的例子中我们会用到它的。这两个函数是画图元时的例行公事代码,
这个函数不断的翻转后台表面。我们可以不断的在后台表面画一些东西,然后把后台表面翻转到前台表面。
shutdowndirect3d()函数
void cframewin::shutdowndirect3d()
{
helper_release(ptexture);
helper_release(pindexbuffer);
helper_release(pstreamdata);
helper_release(pid3ddevice);
helper_release(pid3d);
}
shutdowndirect3d释放所有的接口。将来你可能要加入额外的代码来关闭direct3d接口,但现在已经够了。如果你运行程序,你将得到一个绿色背景的窗口。你可以按“esc”键来退出应用程序。
第三章 画三角形
(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个顶点开始,指定所要画的三角形数目。
如果正确的话,你会看到一个三角形画在先前的绿色背景窗口上。
第四章 画索引三角形
(dx8mfc3)
上一章的画三角形方式运行效率是较低的,而实际上我们都会使用drawindexedprimitive()而不是drawprimitive()。想一想,如果要画两个相连的三角形,共有四个顶点。用drawindexedprimitive()画要画四个顶点,而用drawprimitive()画则要画六个顶点。
如果你可以顶点建立索引,你就可以用drawindexedprimitive()画三角形了。我们可以为一个三角形建立这样的索引:
word indices[] = { 0, 1, 2 };
它表示三角形中,第一个顶点对应于顶点阵列的第0个顶点;三角形中,第二个顶点对应于顶点阵列的第1个顶点;三角形中,第三个顶点对应于顶点阵列的第2个顶点;
要画索引三角形,首先要建立索引缓冲:
num_elems = sizeof(indices) / sizeof(indices[0]);
pid3ddevice->createindexbuffer(sizeof(word) * num_elems,
d3dusage_writeonly,
d3dfmt_index16,