lpVertices [2] ==D3DVERTEX(v3,vNormal,0,0); lpVertices [3] ==D3DVERTEX(v4,vNormal,0,0); lpVertices [4] ==D3DVERTEX(v5,vNormal,0,0); lpVertices [5] ==D3DVERTEX(v6,vNormal,0,0);
一旦您定义了点串行,您可以用之前说过的IDirect3DDevice7::DrawPrimitive方法来绘制出。以下是绘制点串行的程序代码。本章前面学过,任何对
IDirect3DDevice7::DrawPrimitive的呼叫都必须落在呼叫IDirect3DDevice7::BeginScene和IDirect3DDevice7::EndScene中间。
if (FAILED(lpDirect3DDevice7->BeginScene())) { } . . .
if (FAILED(lpDirect3DDevice7->DrawPrimitive(D3DPT_POINTLIST, D3DFVF_VERTEX,lpVertices,TOTAL_VERTICES,0))) {
//如果有错误时,在此处理。 } . . . { }
您可以将材质和贴图应用在点串行上,但是屏幕上的一个小像素无法适当的表示出贴图或材质。同时请记住,不论这些点距离摄影机有多远,他们的直径都是1个像素。如果想要有更大的点,您需要用小的三角形来表示。当绘制完成后,您可以看到一个像图6-2的场景。
//如果有错误时,在此处理。
if (FAILED(lpDirect3DDevice7->EndScene()))
//如果有错误时,在此处理。
图6-2 绘出的点串行
线串行
您可以用第二种基本形状型态-线串行(line list),来定义一群直线段。您可以用这种型态来定义各种简单的单一线条对象。
要建立一个线串行,只要仿照以下程序片段填入一个顶点数组即可。别忘了线串行中定义的顶点数量必须是大于或等于2的偶数。这个范例就是定义这三种线条的程序:
const DWORD TOTAL_VERTICES =6; D3DVERTEX lpVertices [TOTAL_VERTICES]; . . .
D3DVECTOR v1(-10,10,0); D3DVECTOR v2(-8,-5,0); D3DVECTOR v3(-4,3,0); D3DVECTOR v4(1,-6,0); D3DVECTOR v5(2,-1,0); D3DVECTOR v6(12,9,0); D3DVECTOR vNormal(0,0,-1);
lpVertices [0] ==D3DVERTEX(v1,vNormal,0,0); lpVertices [1] ==D3DVERTEX(v2,vNormal,0,0); lpVertices [2] ==D3DVERTEX(v3,vNormal,0,0); lpVertices [3] ==D3DVERTEX(v4,vNormal,0,0); lpVertices [4] ==D3DVERTEX(v5,vNormal,0,0); lpVertices [5] ==D3DVERTEX(v6,vNormal,0,0);
一旦您定义了线串行,您可以用IDirect3DDevice7::DrawPrimitive方法来绘制它,就好像绘制点串行时一样。绘制线串行的程序如下。当绘图作业完成后,您可以看到一个像图6-3的场景。
if (FAILED(lpDirect3DDevice7->BeginScene())) { } . . .
if (FAILED(lpDirect3DDevice7->DrawPrimitive(D3DPT_LINELIST, D3DFVF_VERTEX,lpVertices,TOTAL_VERTICES,0))) { } . . .
if (FAILED(lpDirect3DDevice7->EndScene())) { }
//如果有错误时,在此处理。
//如果有错误时,在此处理。
//如果有错误时,在此处理。
图6-3 绘出的线串行
如同点串行一样,您可以将材质和贴图应用在线串行上。就好像点的大小只有一个像素一样,线条也是只有一个像素宽。如果您需要绘制较宽的线,或是您希望宽度随线条离摄影机的距离而改变时,您应该改用窄三角形的组合来表示线条。
线条块
您可以用第三种基本形状型态-线条块(line strip)来描述一连串相连的线段。您可以用线条块来建立开放的多边形-换句话说,也就是最后的顶点和第一个顶点间没有用线段来连接的多边形。
您可以像在点和线串行一样地填入某个顶点数组,以建立线条块。以下的程序范例说明了如何填入这个串行:
const DWORD TOTAL_VERTICES =5; D3DVERTEX lpVertices [TOTAL_VERTICES]; . . .
D3DVECTOR v1(-8,-8,0); D3DVECTOR v2(-3,-9,0); D3DVECTOR v3(-1,0,0); D3DVECTOR v4(9,-2,0); D3DVECTOR v5(7,-6,0); D3DVECTOR vNormal(0,0,-1);
lpVertices [0] ==D3DVERTEX(v1,vNormal,0,0); lpVertices [1] ==D3DVERTEX(v2,vNormal,0,0); lpVertices [2] ==D3DVERTEX(v3,vNormal,0,0); lpVertices [3] ==D3DVERTEX(v4,vNormal,0,0); lpVertices [4] ==D3DVERTEX(v5,vNormal,0,0);
一旦您定义了线条块,您可以用IDirect3DDevice7::DrawPrimitive方法来绘制它,就好像绘制点和线串行时一样。以下这些程序是要绘制线条块,图6-4则是程序产生的线条块结果。
if (FAILED(lpDirect3DDevice7->BeginScene())) { } . . .
if (FAILED(lpDirect3DDevice7->DrawPrimitive(D3DPT_LINESTRIP, D3DFVF_VERTEX,lpVertices,TOTAL_VERTICES,0))) {
//如果有错误时,在此处理。
} . . .
//如果有错误时,在此处理。
if (FAILED(lpDirect3DDevice7->EndScene())) { }
//如果有错误时,在此处理。
图6-4 绘出的线条块
三角形串行
您可以用第四种基本形状型态-三角形串行(triangle list),来创造独立三角形的串行。别忘了三角形串行所定义的顶点数量必须是3的倍数。您可以利用这种串行来建立由不连接的小块构成的对象。以下是定义了二个三角形的串行的程序:
const DWORD TOTAL_VERTICES =6; D3DVERTEX lpVertices [TOTAL_VERTICES]; . . .
D3DVECTOR v1(-10,-5,0); D3DVECTOR v2(-5,5,0); D3DVECTOR v3(0,-5,0); D3DVECTOR v4(1,-5,0); D3DVECTOR v5(6,5,0); D3DVECTOR v6(11,-5,0);