第二章绘制三角形.docx

上传人:夺命阿水 文档编号:600094 上传时间:2023-09-06 格式:DOCX 页数:8 大小:98.67KB
返回 下载 相关 举报
第二章绘制三角形.docx_第1页
第1页 / 共8页
第二章绘制三角形.docx_第2页
第2页 / 共8页
第二章绘制三角形.docx_第3页
第3页 / 共8页
第二章绘制三角形.docx_第4页
第4页 / 共8页
第二章绘制三角形.docx_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《第二章绘制三角形.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)(/Process

16、messageTranslateMessage(&msg);DispatchMessage(&msg);)else(/Nomessagetoprocess,sorenderthecurrentsceneRender();)/Thewindowsmessagehandler1.RESULTWINAPIWinProc(HWNDhWndzUINTmsg,WPARAMwParam,LPARAMIParam)(switch(msg)(caseWmdestroy:PostQuitMessage(O);returnO;break;caseWM_KEYUP:switch(wParam)(caseVK_ESCA

17、PE:/Userhaspressedtheescapekey,soquitDestroyWindow(hWnd);returnO;break;)break;returnDefWindowProc(hWndzmsg,wParamzIParam);)/ApplicationentrypointINTWINAPIWinMain(HINSTANCEhlnst,HINSTANCE,LPSTR,INT)(/RegisterthewindowclassWndclassexwc=sizeof(wndclassex),cs_classdc,wi11Proc,olzolzGetModuleHancile(NULL

18、)zNULLzNULL,NULL,NULL,uDXProject2zNULL;RegisterClassEx(&wc);/CreatetheapplicationswindowHWNDhWnd=CreateWindow(DXProject2,z”:Tutorial2,zWSJDVERLAPPEDW工NDoW,50,50z500z500zGetDesktopWindowO,NULL,wc.hlnstancezNULL);/InitializeDirect3Dif(SUCCEEDED(InitialiseD3D(hWnd)(/ShowourwindowShowWindow(hWnd,SWSHOWD

19、EFAULT);UpdateWindow(hWnd);/InitializeVertexBufferif(SUCCEEDED(InitialiseVertexBuffer()(/Startgamerunning:EnterthegameloopGameLoop();)Cleanup();UnregisterClass(,DXProject2,zwc.hlnstance);returnO;运行程序,你会得到一个背景为黑色的窗口。窗口的中央是一个三角形,被三原色过渡填充的三角形,很漂亮,不是吗?真高兴,现在我们已经可以绘制一些真正的图形了。看图来说,上面的一些东西就不难理解了。好了,下面有一幅程序

20、运行时的截图:嘿嘿,添加了几行代码,得到了如此漂亮的图形,不是很复杂,对吧?那末,我们都做了什么改动呢?WinMainWinMain函数作了细微的调整,就是初始化DireCt3D后又调用了InitialiSeVerteXBUffer函数。这是顶点缓冲的指针。注意它是全局的,所以可以被所有的函数使用。这就是我们存储三角形的顶点的地方了,顶点缓冲,对,就是那个。CUSTOMVERTEX这是我们自定义的顶点格式,为什么能自定义呢?对!因为DireCt3D支持的灵活顶点格式(FVF)C其中我们都指定了xzy,zzrhw和颜色属性。D3DFVF_CUSTOMVERTEX上面的CUSTOMVERTEX乃是

21、我们自定义的顶点格式,但自定义也不能随便定义,我们需要按照一定的规则,而且也需要通知DX我们的格式知怎样定义的。所以,我们定义了这个标识D3DFVF_CUSTOMVERTEX,它运用了DX原有的两个标识D3DFVF_XYZRHW和D3DFVJDIFFUSE(已转换顶点和扩散颜色)定义了我们自己的格式,而且,跟上面我们定义的CUSTOMVERTEX格式是相吻合的。明白了吗?也就是说:我们要按照DX支持的各种顶点属性和它们的标识来组合出我们自己需要的顶点格式和标识,而标识是用来通知DX的。InitiaIiseVertexBuffer这是一个新的函数,你已经猜到了:它是用来初始化定点缓冲的。在函数中

22、,首先定义了一个CUSTOMVERTEX型的数组CVVertices,并按照前面我们所定义的格式输入了三个不同的顶点,位置不同颜色也不同。注意:在本例中,顶点的Z值应该在0到1之间,因为现在的程序只能支持一些2D的图形,这样做是为了让程序最简单且容易理解。不用急,以后我们就会创建真正的3D图形了。然后我们利用设备借口调用了CreateVertexBuffer函数来初始化我们的顶点缓冲。注意第一个参数我们输入了顶点缓冲的大小,因为我们输入了三个顶点,所以是3个CUSTOMVERTEX的大小。此函数将给我们一个指向顶点缓冲的指针(g-pVerteBuffer)(.这时我们的顶点缓冲已经创建好了,我

23、们应该把我们指定好的顶点传送给它:锁定顶点缓冲传送已经被保存的顶点-解除锁定。到这里,我们的顶点缓冲算是真正的准备完毕了。Render我们也细微地改动了这个函数。首先我们捆绑了顶点缓冲到设备数据流,然后设置了顶点着色方法,最后,调用了DraWPrimitiVe来完成绘制工作。DraWPrimitiVe的第一个参数是绘图方法(就是在文章上面的3DPrimitiVe中我们提到的方法),我们用了三角形列(D3DPT_TRIANGLELIST)。下个参数是起始顶点,最后是需要画的图形的数目,这里我们设置为1,因为只有一个三角形要绘制。嗯,我们还用了D3DC0L0R_XRGB宏使背景成为了黑色(0,0,

24、0)oSafeReIease我们还创建了这个SafeReIease宏。此宏能安全而简便地释放COM对象。Summary(摘要)啊,第二个教程完成了,你一定有所收获吧?我相信是的。不过我挺累,我已经尽力翻译好了,怎么样?在此,我们学习了很多理论性的东西,不过,应该很容易,对吧?啊对,你可以随意改动本文的例子,绘制更多的三角形、更漂亮的图案,译者本人(我)就是这样做的,很有意思。下个教程,我们就会创建真正的3D图形了!怎么样?激动吧?呵呵呵呵.总是我在说,也的给原著点面子吧!So,thereyouhaveit.Thesecondtutorialisnowcomplete.Wevelearntalotinthistutorial:Vertices,CoordinatedSystems,3DPrimitives,FVF,VertexBuffersandspecifyingcolours.Totakethistutorialabitfurther,tryaddinganothertriangle.Inthenexttutorialwewillcreateourfirstreal3Dobject.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号