《第二章绘制三角形.docx》由会员分享,可在线阅读,更多相关《第二章绘制三角形.docx(8页珍藏版)》请在优知文库上搜索。
1、第二章:绘制三角形Introduction(Jf)所有的3D图形都是由三角形构成的。为什么是三角形而不是别的图形呢?因为三角形有许多优越之处,例如:绘制效率。(译者:而且我们知道,任意不在同一条直线上的三个点都能构成三角形,这对于在空间中形成某种复杂图形是很有益处的,我的理解.)所以,如果我们想得到个矩形,最有效率的是绘制两个相同的合并的三角形,这样要优于直接绘制一个矩形。所以,本教程下面将告诉你如何绘制复杂物体的最小单元:三角形。(译者:神奇的三角形啊.)Vertices(顶点)顶点(VerteX)是什么?顶点就是3D空间中的一个点。例如,三角形有三个顶点,而矩形有四个。在3D空间中,你可以
2、用三个顶点来指定一个三角形。想做到这些,你需要了解迪卡尔坐标系统。2DCartesiancoordinatesystem(2D迪卡尔坐标系统)下面的两幅图演示了2D迪卡尔坐标系统是怎样工作的。2DCartesianCoordinatesFig2.12D迪卡尔坐标系统是很简单的,用两条轴x、y的值来表示点的位置,进而表现出图形的位置。这是初中时我们就学习过的。3DCartesiancoordinatesystem(3D迪卡尔坐标系统)下面的两幅图演示了左手3D迪卡尔坐标系统是怎样工作的。两个轴显然不够用了,所以,有了第三个轴:z2D坐标系统只有X轴与y轴,因为它是平面的。而在3D空间里,轴。现在
3、,我们用这三个轴就能在3D空间中表示出物体的任意位置了。这其实是很简单的事情,我就不多说了。3DPrimitivesPrimitiVe为“原始”之意,3Dprimitive就是设备所支持的原始的类型。它包括:点列、线列、线代、三角形列、三角形带和三角扇形。使用3Dprimitive完成上述的图形是很方便的。以后我们会用3Dprimitive来绘制图形。下面的一些例子演示了上述的各种方式:PointLists(点列)(3k5,0)(7,5,0)(11,5,0)(1.1.0)(5,1,0)(9,1,0)Fig2.51.ineLists1.ineStripsTriangleListsFig2.8Tr
4、iangleStrips(三角形带)TriangleFans(三角扇形)FlexibleVertexFormat(FVF)(灵活顶点格式)FIeXibIe的意思是“灵活的”。这里不译为“灵活的顶点格式”而译为“灵活顶点格式”是有原因的:前者是一个短语,像是广告词一样;后者才更像是一种名词或术语。所以,我取了后者。灵活顶点格式(FVF)是用来描述顶点属性的一种格式,而这种格式是可以由我们自定义的,所以称它为“灵活顶点格式”。至此,我们至少知道了顶点有三种属性:X值、y值和Z值。其实顶点还可以有其他属性,例如颜色与亮度。利用灵活顶点格式(FVF)我们能方便的指定顶点的属性。如果我们在DireCt3
5、D指定了一个多边形,这个多边形将可以被它的各个顶点的属性所填充,带有过渡性的属性填充。我知道这个不太好理解,没关系,下面我们有例子,它也正是这样做的:在我们下面的例子中,将会有一个三个顶点所组成的三角形,三角形的每个顶点的颜色都是不同的,他们分别是红、绿、蓝,电脑中的三原色。三角形将会被这三种颜色混合的、渐变的填充起来。VertexBuffers(顶点缓冲)顶点缓冲就是一块用于保存顶点的内存缓冲区。顶点缓冲可以保存任何的顶点类型。当你的一些顶点已经被保存在顶点缓冲区中,你就可以操作它们了,例如渲染、变换和剪裁。Colours(颜色)在DireCtX中,如果我们要指定一种颜色,我们可以用D3DC
6、OLOR_XRGB宏。宏中有三个参数,每个参数都是0到255间的整数值,分别用于描述颜色的红、绿、蓝分量,然后D3DCOLOR_XRGB宏会将它们调和,就像水彩调色一样。例如:D3DCOLOR-RGB(Oz0,0)是黑色(无色)。D3DCOLOR_XRGB(255Z255z255)是纯白色(满色调)。D3DCOLOR_XRGB(Oz255z0)是亮绿色(没有红与蓝,全是绿色的分量)。D3DCOLOR-RGB(100z20,100)是暗紫色(100红,20绿,IoO蓝)。好了,我们第二章的例子就在这了。它和第一个例子差不多,只是添加了一些代码、做了些修改。仔细研究吧!Itseasy!includ
7、e1.PDIRECT3D8g_pD3D=NULL;1.PDIRECT3DDEVICE8g_pD3DDevice=NULL;1.PDIRECT3DVERTEXBUFFER8g_pVertexBuffer=NULL;/BuffertoholdverticesstructCUSTOMVERTEX(FLOATx,y,z,rhw;/Thetransformedpositionforthevertex.DWORDcolour;/Thevertexcolour.);#defineD3DFVFCUSTOMVERTEX(D3DFVFXYZRHWD3DFVFDIFFUSE)#defineSafeRelease(p
8、bject)if(pbject!=NULL)pObject-Release();pObject=NULL;HRESULTInitialiseD3D(HWNDhWnd)(/Firstofall,createthemainD3Dobject.Ifitiscreatedsuccessfullywe/shouldgetapointertoanIDirect3D8interface.gpD3D=Direct3DCreate8(D3DSDKVERSION);if(gpD3D=NULL)(returnE_FAIL;)/GetthecurrentdisplaymodeD3DDISPLAYM0DEd3ddm;i
9、f(FAILED(g_pD3D-GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)(returnE_FAIL;)/CreateastructuretoholdthesettingsforourdeviceD3DPRESENT_PARAMETERSd3dpp;ZeroMemory(d3dppzsizeof(d3dpp);/Fillthestructure./Wewantourprogramtobewindowed,andsetthebackbuffertoaformat/thatmatchesourcurrentdisplaymodewed=TRUE
10、;ffect=D3DSWAPEFFECT_C0PY_VSYNC;UfferFormat=t;/CreateaDirect3Ddevice.if(FAILED(gpD3D-CreateDevice(D3DADAPTERDEFAULT,D3DDEVTYPEHAL,hWnd,D3DCREATESOFTWAREVERTEXPROCESSING,&d3dpp,&g_pD3DDevice)(returnE_FAIL;)returnS_OK;HRESULTInitialiseVertexBuffer()(VOID*pVertices;/Storeeachpointofthetriangletogetherw
11、ithit,scolourCUSTOMVERTEXcvVertices=/Vertex1-Red(250,100)250.0fz100.Of,0.5f,1.0f,D3DCOLOR_XRGB(255z0,0),/Vertex2-Green(400z350)400.0fz350.Of,0.5fz1.0fzD3DCOLOR_XRGB(0z255,0),/Vertex3-Blue(100,350)100.0f,350.Of,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255),r/Createthevertexbufferfromourdeviceif(FAILED(gpD3DDevice
12、-CreateVertexBuffer(3*sizeof(CUSTOMVERTEX)z0zD3DFVFCUSTOMVERTEX,D3DPOOLDEFAULT,&g_pVertexBuffer)(returnE_FAIL;/Getapointertothevertexbufferverticesandlockthevertexbufferif(FAILED(gpVertexBuffer-Lock(0zsizeof(CvVertices),(BYTE*)&pVertices,0)(returnE_FAIL;)/Copyourstoredverticesvaluesintothevertexbuff
13、ermemcpy(pVertices,cvVertices,sizeof(CvVertices);/UnlockthevertexbuffergpVertexBuffer-Unlock();returnS_OK;voidRender()(if(g_pD3DDevice=NULL)(return;)/Clearthebackbuffertoblackg_pD3DDevice-Clear(0,NULL,D3DCLEARJARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);/BeginthescenegpD3DDevice-BeginScene();/Renderingourtri
14、angleg_pD3DDevice-SetStreamSource(0,g_pVertexBuffer,sizeof(CUSTOMVERTEX);g2pD3DDevice-SetVertexShader(D3DFVF_CUSTOMVERTEX);g2pD3DDevice-DrawPrimitive(D3DPT_TRIANGLELIST,0,1);/Endthesceneg_pD3DDevice-EndScene();/Filpthebackandfrontbufferssothatwhateverhasbeenrenderedonthe/backbufferwillnowbevisibleon
15、screen(frontbuffer)g_pD3DDevice-Present(NULL,NULL,NULL,NULL);voidCleanUp()SafeRelease(g_pD3DDevice);SafeRelease(g_pD3D);voidGameLoop()(/EnterthegameloopMSGmsg;BOOLfMessage;PeekMessage(&msg,NULL,OU,OU,PM_NOREMOVE);while(ge!=WMQUIT)(fMessage=PeekMessage(&msg,NULL,OUzOU,PM_REMOVE);if(fMessage)(/ProcessmessageTranslateMessage(&msg);DispatchMessage(&msg);)else(/Nomessagetoprocess,sorenderthecurrentsceneRe