下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4基于Direct3D的圖第3OpenGL是一個(gè)跨平臺(tái)的專業(yè)化的底層圖形編程接口,可用于繪制2D/3DOpenGL只是一個(gè)圖形函數(shù)庫(kù),隨著多技術(shù)的發(fā)展,其應(yīng)用領(lǐng)域越來越受到限制。正是基于這個(gè)原因,隆重推出了全新的多編程接口DirectX。DirectXDirectX不僅支持圖形/圖像編程,而且支持聲音、等,加之公司的強(qiáng)勢(shì)推廣,DirectXOpenGL的最大對(duì)手,并在用戶之間了曠日持久的大論戰(zhàn)。本文不打算評(píng)論它們孰是孰非,僅介紹一下DirectX圖形繪制功能。DirectX(DirecteXtension,DX)是由公司創(chuàng)建的多編程接口。從字面上看,DirectXAPIC++編程語言實(shí)現(xiàn),遵循通用對(duì)象模式(CommonObject使以Windows為平臺(tái)的游戲或多程序獲得更高的執(zhí)行效率。DirectX一路跌跌撞撞地走來,經(jīng)受了諸多磨難,經(jīng)歷了多個(gè)版本更替,從最早的DirectX試用版到的DirectX11.0,每一次新版本的推出都催生了一大批新產(chǎn)品。發(fā)展到現(xiàn)在,DirectX儼然已成為游戲產(chǎn)業(yè)界的巨無霸,已成為了事實(shí)上的標(biāo)準(zhǔn)。DirectX9.0b版本,可從公司直接DirectX并不是一組單API,它是一組低API,包含DirectGraphicsDirectInput、DirectPlay、DirectShow等多個(gè)組件,提供了一整套的多接口方案,如圖4.1 4.1DirectX組成結(jié)DirectXGraphicsDirectXGraphicsDirectDrawDirect3D而Direct3D主要提供三維繪圖硬件接口,是開發(fā)三維DirectX游戲的基礎(chǔ)。聲音部分DirectXAudio。其中最主要的API是DirectSound,除了 混音之外,還加強(qiáng)了3D音效,提供了 功能。DirectSound為程序和音頻適配器的混音、 MIDI音樂合成和 網(wǎng)絡(luò)部分。其中的DirectPlay主要是為了網(wǎng)絡(luò)功能游戲開發(fā)的,提供了多種連接方式,讓玩家可以用各種聯(lián)網(wǎng)方式來進(jìn)行對(duì)戰(zhàn)。DirectShow提供了在計(jì)算機(jī)與Internet服務(wù) DV、MPEG、MP3、WMA/WMV以及WAV文件。DirectXSDK安裝和括了編譯DirectX應(yīng)用程序所需要的編譯庫(kù)文件(*.lib)、頭文件(*.h)、示例和幫助。安裝DirectX DirectX9.0SDK4.2所示。Yes按鈕,表示接受協(xié)議要求,開始釋放文件,如圖4.3所示。 圖4.2安裝初始窗 圖4.3釋放文件示意圖4.4解壓文 圖4.5歡迎窗圖4.6安裝協(xié)議窗 圖4.7更改安裝信 圖4.8安裝選 圖4.9安裝進(jìn)程示意 框4.10安裝結(jié)束窗安裝完畢后,可 C:\DXSDK\路徑中看到以 SDKDevInclude:頭文件Lib:*.LIB庫(kù)文件,用于VC++編譯器SamplesBinDoc:幫助和Readme文件基于VisualC+6.0環(huán)境配置 中所有的文件分別到Visual 圖4.11添加頭文件路同樣,再在Libraryfiles項(xiàng)中添加DirectX頭文件的文件夾路徑 需要注意的是,VisualC++6.0在進(jìn)行編譯時(shí),會(huì)根據(jù)列表中文件的排列順序來進(jìn)行頭VisualC++DirectX3.0的頭文件和庫(kù)文件,如果把這兩
Direct3DDirect3D設(shè)備是Direct3D的渲染部件,它封裝并渲染狀態(tài)。此外,Direct3D設(shè)備從結(jié)構(gòu)上講,Direct3D設(shè)備包含一個(gè)變換模塊、一個(gè)光照模塊和一個(gè)光柵化模塊,如圖4.12所示。4.12Direct3D設(shè)備結(jié)設(shè)備類當(dāng)前Direct3D主要支持兩種設(shè)備類型:一種是硬件抽象(Hardware ionLayer,HAL)設(shè)備;另一種是參考設(shè)備(ReferenceRasterizer,REF)。可以認(rèn)為它們是兩個(gè)單獨(dú)的驅(qū)備最通常的用法是使用HAL設(shè)備應(yīng)用程序,而用參考設(shè)備做特性測(cè)試。硬件抽象(HAL)3種不同的頂點(diǎn)處理(D3DCREATE_HARDWARE_VERTEXPROCESSING)以及在同一設(shè)備上的混合頂點(diǎn)處理序應(yīng)該用它進(jìn)行三維操作。Direct3DHAL設(shè)備用硬件實(shí)現(xiàn)變換、光照及光柵化模塊的部分或全部。應(yīng)用程序不直接三維加速卡,它們調(diào)用Direct3D的函數(shù)和方法,而Direct3D通過HAL硬件。性能。要在C++程序中創(chuàng)建一個(gè)HAL設(shè)備,應(yīng)該調(diào)用IDirect3D9::CreateDevice方法,并將D3DDEVTYPE_HAL常數(shù)作為設(shè)備類型傳入。參考設(shè)備(REF)用軟件模擬了所有的Direct3DAPI,支持所有Direct3D特性。因?yàn)檫@些然參考光柵化器盡可能地使用了特殊的CPU指令,但它不是為正式零售的應(yīng)用程序準(zhǔn)備C++IDirect3D9::CreateDevice創(chuàng)建設(shè)要在C++應(yīng)用程序中創(chuàng)建一個(gè)Direct3D設(shè)備,需要?jiǎng)?chuàng)建一個(gè)IDirect3DDevice9對(duì)象。而要?jiǎng)?chuàng)建IDirect3DDevice9對(duì)象,首先要獲得IDirect3D9指針。其基本步驟如下。IDirect3D9接口的指針。因?yàn)榻涌谑羌兲摵瘮?shù),不能被實(shí)一般使用函數(shù)_d3d9=這里,首先一個(gè)指向IDirect3D9接口的指針對(duì)象。IDirect3D9對(duì)象通常有兩個(gè)用建代表物理設(shè)備的IDirect3DDevice9對(duì)象。Direct3DCreate9()D3D_SDK_VERSION。如果函數(shù)調(diào)用填充D3DPRESENT_PARAMETERS結(jié)構(gòu)的typedefstruct{UINTBackBufferWidth;UINTBackBufferHeight;UINTBackBufferCount;typedefstruct{UINTBackBufferWidth;UINTBackBufferHeight;UINTBackBufferCount;DWORDMultiSampleQuality;D3DSWAPEFFECTSwapEffect;BOOLWindowed;BOOLEnableAutoDepthStencil;DWORDFlags;UINTPresentationInterval;}4-1D3DPRESENT_PARAMETERS結(jié)構(gòu)成
BOOL型,設(shè)為true則為窗口模式,false則為全設(shè)為true,D3D將自動(dòng)創(chuàng)建深度/鎖定;D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL:深度/模版緩FullScreen刷新率,設(shè)定D3DPRESENT_RATE_DEFAULT使用默認(rèn)刷新D3DPRESENT_INTERVAL_DEFAULT:D3D選擇交換速度例如,下面的代碼設(shè)置了D3DPRESENT_PARAMETERSZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=D3DFMT_UNKNOWN; IDirect3DDevice9* IDirect3D9::CreateDevice(UINTHWNDhFocusWindow,DWORDBehaviorFlags,4-2CreateDevice參數(shù) 為
&d3dpp,&g_pd3dDevice)))returnE_FAIL;選擇設(shè)//初始化D3DPRESENT_PARAMETERS成員的值。d3dpp.BackBufferFormat=D3DFMT_X1R5G5B5;//初始化D3DPRESENT_PARAMETERS成員的值。d3dpp.BackBufferFormat=D3DFMT_X1R5G5B5;returnE_FAIL;IDirect3D9::GetDeviceCaps方法檢查設(shè)備對(duì)希望使用的功能的支持度。UINTAdapter,型,即硬件設(shè)D3DDEVTYPE_HAL,軟件設(shè)D3DDEVTYPE_REF;參PCaps返回一個(gè)已初始化的D3DCAPS9結(jié)構(gòu),D3DCAPS9結(jié)構(gòu)成員的值參見表4-3。4-3D3DCAPS9結(jié)構(gòu)成員的 64IDirect3D9::GetDeviceCaps返回的能力都是可用的。
點(diǎn)4.13點(diǎn)structstruct{floatx,y,z;};CUSTOMVERTEXVertices[]={{-5.0,-5.0,{0.0,5.0,{5.0,-5.0,{10.0,5.0,{15.0,-5.0,{20.0,5.0,0.0}線線4.14線structstruct{floatx,y,z;};CUSTOMVERTEXVertices[]={{-5.0,-5.0,{0.0,5.0,{5.0,-5.0,{10.0,5.0,{15.0,-5.0,{20.0,5.0,0.0}4.15線structstruct{floatx,y,z;};CUSTOMVERTEXVertices[]={{-5.0,-5.0,{0.0,5.0,{5.0,-5.0,{10.0,5.0,{15.0,-5.0,{20.0,5.0,0.0}struct{floatx,y,z;};CUSTOMVERTEXstruct{floatx,y,z;};CUSTOMVERTEXVertices[]={{-5.0,-5.0,{0.0,5.0,{5.0,-5.0,{10.0,5.0,{15.0,-5.0,{20.0,5.0,4.16三角形4.17三角形v1、v2v3畫第一個(gè)三角形,v2、v4v32個(gè)三角形,v3、v4和v53個(gè),v4,v6v5424個(gè)三角形的頂點(diǎn)順序structstruct{floatx,y,z;};CUSTOMVERTEXVertices[]={{-5.0,-5.0,{0.0,5.0,{5.0,-5.0,{10.0,5.0,{15.0,-5.0,{20.0,5.0,4.18三角形struct{floatx,y,z;};CUSTOMVERTEXVertices[]={{0.0,0.0,{-5.0,5.0,{-3.0,7.0,{0.0,10.0,{3.0,7.0,{5.0,5.0,0.0}v2、v3v11個(gè)三角形,v3、v4v12個(gè)三角形,v4、v5和v1畫第3個(gè)三角形,依次類推struct{floatx,y,z;};CUSTOMVERTEXVertices[]={{0.0,0.0,{-5.0,5.0,{-3.0,7.0,{0.0,10.0,{3.0,7.0,{5.0,5.0,0.0}Direct3D應(yīng)用程序方式很快得到了廣泛的認(rèn)可,幾乎所有的主流顯示卡都對(duì)Direct3D提供良好的支持。 不能直接作用于圖形設(shè)備,可看成是應(yīng)用程序和圖形設(shè)備之間的中介,如圖4.194.19應(yīng)用程序、Direct3D和圖形設(shè)備之間的關(guān)間的硬件差異。因此,Direct3D不要求設(shè)計(jì)人員去了解某個(gè)設(shè)備的特殊細(xì)節(jié)。4.20Direct3D程序基本結(jié)創(chuàng)建窗假設(shè)使用Win32API設(shè)計(jì)Direct3D應(yīng)用程序,一般在WinMain函數(shù)中WNDCLASSEXWNDCLASSEXwc{structstruct{UINTWNDPROClpfnWndProc;intcbClsExtra;intcbWndExtra;HINSTANCEhInstance;HICONhIcon;HCURSORhCursor;LPCSTRlpsz 4-4WNDCLASS 為來 RegisterClass(&wc來UnregisterClass(LPCSTRlpClassNameHINSTANCEhInstance)函LPCTSTRlpClassName,DWORDdwStyle,intx,intnWidth,nHeight,HWNDhWndParent, HINSTANCEhInstance,LPVOIDlpParam4-5CreateWindow參數(shù)含 nWidth,指定新建窗口的父窗口,一般設(shè)為hHWNDHWNDhWndCreateWindowClassName第一DirectX程序",WS_OVERLAPPEDWINDOW,200,100,600,500,NULL,NULL,wc.hInstance,NULL初始化創(chuàng)建Direct3DCreateVertexBuffer(UINTDWORDUsage,DWORDFVF,CreateVertexBuffer(UINTDWORDUsage,DWORDFVF,4-6CreateVertexBuffer參數(shù)含 成一個(gè)保留的參數(shù),可以設(shè)置為z函數(shù)原型如下: LRESULTWINAPIWinProc(HWNDhWnd,UINT ram,LPARAM4-7WinProc參數(shù)含 ESULiPo(WD{switch(msg{casePostQuitMessage(0);return0;ValidateRect(hWnd,NULL);return0;}returnDefWindowProc(hWnd,//釋放//圖形ram,lParam}圖形繪4.21Direct3D中渲染圖形的基本步可使用Clear(DWORDconstD3DRECT*pRects,DWORDFlags,D3DCOLORfloat
4-8Clear參數(shù)含 種標(biāo)記:D3DCLEAR_STENCIL、D3DCLEAR_TARGET、Z設(shè)置Z緩沖Z初始使 SetStreamSource()函數(shù)頂點(diǎn)緩沖到設(shè)備。SetStreamSource()函數(shù)的原型如下SetStreamSource(UINTIDirect3DVertexBuffer9*pStreamData,UINTOffsetInBytes,4-9SetStreamSource參數(shù)含 ]g_pd3dDevice->調(diào)用IDirect3DDevice9::SetFVF()函數(shù)來設(shè)置頂點(diǎn)樣色,即頂點(diǎn)。g_pd3dDevice->調(diào)用 DrawPrimitive()函數(shù)來完成繪制工作。函數(shù)原型如下DrawPrimitive(D3DPRIMITIVETYPEPrimitiveType,UINTtypedefenum}D3DPRIMITIVETYPE,typedefenum}D3DPRIMITIVETYPE,D3DPT_POINTLIST=//D3DPT_LINELIST=//D3DPT_LINESTRIP=//線D3DPT_TRIANGLELIST=//三角D3DPT_TRIANGLEFAN=//三角D3DPT_FORCE_DWORD=//參數(shù)StartVertexDrawPrimitive()函數(shù)來渲染圖元,即使用頂點(diǎn)緩沖來繪畫圖元。也可以DrawPrimitiveUP()函數(shù)的原型DrawPrimitiveUP(D3DPRIMITIVETYPEPrimitiveType,unsignedintconstvoid
4-10DrawPrimitiveUP函數(shù)參數(shù)的含渲染完畢,使 Present()函數(shù)來把后備緩沖區(qū)的內(nèi)容顯示到屏幕上,原型如下constRECT*pSourceRect,constRECT*pDestRect,HWNDhDestWindowOverride,
4-11Present參數(shù)含 要顯示的后備緩沖區(qū)的矩形區(qū)域。若為NULL則把整個(gè)后備緩沖區(qū)的內(nèi)容表示一個(gè)顯示區(qū)域。設(shè)為NULL表示整個(gè)客戶顯示為 g_pd3dDevice->Present(NULL,NULL,NULL,NULL 基于Win32創(chuàng)建Direct3DDirectX天生就能與Win32很好地結(jié)合,凡是用到DirectX技術(shù)的地方大多是使用DirectXGraphics需要自己控制屏幕上的每一個(gè)像素,MFC等類庫(kù)顯然不適MyD3D_1項(xiàng)再在MyD3D_1項(xiàng)目中新建一個(gè).Cpp文件Main.Cpp。#includeLPDIRECT3D9g_pD3D=NULL; //Direct3D對(duì)象LPDIRECT3DDEVICE9g_pd3dDevice=NULL; LPDIRECT3DVERTEXBUFFER9g_pVertexBuffer=NULL; struct //{FLOATx,y,z,rhw;DWORDcolour;#defineD3DFVFCUSTOMVERTEX(D3DFVFXYZRHW|D3DFVFDIFFUSE)HRESULTInitD3D(HWNDhWnd){//創(chuàng)建Direct3D對(duì)象,該對(duì)象用來創(chuàng)建Direct3D設(shè)備if(NULL==(gpD3D=Direct3DCreate9(D3DSDKVERSION))returnE//設(shè)置D3DPRESENT_PARAMETERS結(jié)構(gòu),準(zhǔn)備創(chuàng)建Direct3D設(shè)備ZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECTDISCARD;d3dpp.BackBufferFormat=D3DFMTUNKNOWN;//創(chuàng)建Direct3D設(shè)備if(FAILED(gpD3D->CreateDevice(D3 PTERDEFAULT,D3DDEVTYPEHAL,hWnd,returnEFAIL;returnSOK;}HRESULT{VOID*pVertices;CUSTOMVERTEXcvVertices[]={{250.0f,100.0f,0.5f,1.0f,D3DCOLORXRGB(255,0,{400.0f,350.0f,0.5f,1.0f,D3DCOLORXRGB(0,255,{100.0f,350.0f,0.5f,1.0f,D3DCOLORXRGB(0,0,if(FAILED(gpd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVFCUSTOMVERTEX,D3DPOOLDEFAULT,&gpVertexBuffer,NULL)))returnE returnEFAIL;returnS_OK;}void{if(g_pd3dDevice==NULL)//清 g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);//開始 {//在此 g_pd3dDevice->SetStreamSource(0g_pVertexBuffer放入顯示卡g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0, } g_pd3dDevice->Present(NULL,NULL,NULL,NULL}void{ifg_pVertexBuffer //釋放Direct3D頂點(diǎn){g_pVertexBuffer=NULL;}ifg_pd3dDevice //釋放Direct3D設(shè)備{g_pd3dDevice=NULL;}if(g_pD3D //釋放Direct3D對(duì){g_pD3D=NULL;}}LRESULTWINAPIWinProc(HWNDhWnd,UINT {switch(msg{caseWM_DESTROY:PostQuitMessage(0);return0;caseValidateRect(hWnd,NULL);return0;}returnDefWindowProc(hWnd,ram,lParam}INTWINAPIWinMain(HINSTANCEhInst,HINSTANCE,LPSTR,{ WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,RegisterClassEx(&wc);//創(chuàng)建HWNDhWndCreateWindowClassName第一DirectX程序",WS_OVERLAPPEDWINDOW,200,100,600,500,NULL,NULL,wc.hInstance,NULL//初始化if(SUCCEEDED(InitD3D(hWnd)){ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd);if(SUCCEEDED(InitialiseVertexBuffer進(jìn)入消息循環(huán){MSGZeroMemory(&msg,sizeof(msg));while(msg.message!=WM_QUIT){if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE){TranslateMessage(&msg); essage(&msg);}Render();//渲染}}}UnregisterClass("ClassName",wc.hInstance);return0;}代碼分WinMain()3個(gè)函數(shù),InitD3D()Direct3D初始化,InitialiseVertexBuffer()函數(shù)用于設(shè)置頂點(diǎn)緩存,而圖形渲染由Render()函數(shù)完成。窗口函數(shù)WinProc()實(shí)現(xiàn)消息處理,可以調(diào)用CleanUp()函數(shù)釋放對(duì)象,或者調(diào)用Object/libraryObject/librarymodules圖4.22設(shè)置庫(kù)文 圖4.23第一個(gè)DirectX程基于MFC創(chuàng)建Direct3DMFCDirect3D程序,生成一個(gè)藍(lán)色背景的Direct3D窗口,繪制一個(gè)三角形。MyD3D_2項(xiàng)繪制好的三維圖形顯示在該窗口,而所有和Direct3D相關(guān)的代碼也都放在該類中。ID_D3D_BEGINID_D3D_END4.24新建兩個(gè)工具按#includeclassCMainFrame:public#includeclassCMainFrame:public{CD3DWndvoidvoid{0,AfxRegisterWndClass(0,NULL,NULL,NULL),"Direct3D窗口WS_POPUP|WS_CAPTION|WS_VISIBLE,CRect(100,100,500,500),this,0);}void{} 4.25初步運(yùn)行結(jié)Direct3D程序T3DCpD;D再添加一個(gè)成員函數(shù)InitD3D()voidvoid{//創(chuàng)建Direct3D對(duì)象,并獲IDirect3D9的指//將通過該指針操作Direct3D對(duì)象m_pD3D=d3dpp.Windowed //創(chuàng)建窗口模式的Direct3D程d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;//調(diào)用方法IDirect3D9::CreateDevice創(chuàng)建設(shè)//并獲取接口IDirect3DDevice9的指針,將通過該指針操 &d3dpp,//指定設(shè)備類型為//Direct3D}InitD3D()函數(shù),以便在創(chuàng)建窗口的同時(shí)完成初始化工作,代碼如下:{if(CWnd::OnCreate(lpCreateStruct)==-1)return-1; //return}R{0,NULL, 1.0f,0);//Direct3D規(guī)定在渲染前必須調(diào)用方法 //所以這里為空,生成的Direct3D窗口將是一個(gè)藍(lán)色背景m_pDevice-}vO{}//Rendervoidvoid{m_pDevice->Release();//釋放設(shè)備對(duì)象 }為CD3DWnd添加WM_DESTROY消息處理函數(shù)OnDestroy()在其中調(diào)用voidvoid{ //釋放}要的庫(kù)文件d3d9.lib。繪制三角形4.26三角形數(shù)學(xué)模作為實(shí)體的圖元格式,頂點(diǎn)排列順序?yàn)锳、B、C,正面(可視面)朝外。sttsttERTEX部分//入F頂義,代碼{floatx,y,z;DWORDcolor;//頂點(diǎn)//頂點(diǎn)voidvoid{CUSTOMVERTEXvertices1.0f1.0f0.0fD3DCOLOR_XRGB(255,0,0 //A0.0f1.0f0.0fD3DCOLOR_XRGB(0,255,0 //B1.0f1.0f0.0fD3DCOLOR_XRGB(0,255,255C//創(chuàng)建頂點(diǎn)緩存區(qū),并獲取接口IDirect3DVertexBuffer9m_pDevice- 0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&m_pVB,NULL);void*m_pVB->Lock(0,sizeof(vertices),(void**)&pVertices,0);memcpy(pVertices,vertices,sizeof(vertices));m_pVB-}修改CD3DWnd::OnCreate,增加對(duì)InitGeometry()函數(shù)的調(diào)用,代 //進(jìn)行m_pVB-m_pVB- 時(shí)器,在WM_TIMER的處理函數(shù)中不斷改變旋轉(zhuǎn)角度。對(duì)于視角變換,觀察點(diǎn)定在(0,3,-5)Y軸的正向,{0,1,0intm_nRotateY; intm_nRotateY; voidSetupMatrices該函數(shù)用于設(shè)置3個(gè)變換矩陣SetupMatrices()函數(shù)的實(shí)現(xiàn)voidvoid{floatanglem_nRotateY*D3DX_PI180把旋轉(zhuǎn)角換算成弧度D3DXMATRIXmatWorld;m_pDevice->SetTransformm_pDevice->SetTransformD3DTS_WORLD&matWorldD3DXVECTOR3eye(0.0f,3.0f,-5.0f);//觀察點(diǎn)D3DXVECTOR3lookat0.0f0.0f0.0f視線目標(biāo)點(diǎn)D3DXVECTOR3up(0.0f,1.0f,0.0f);//上方向::D3DXMatrixLookAtLH(&matView,&eye,&lookat,&upm_pDevice->SetTransform(D3DTS_VIEW,&matView);D3DXMATRIXA16matProj;//計(jì) 100.0f);}nRan:OnCreateSetTimer(1,40,NULL//定時(shí)間隔設(shè)為{m_nRotateY //{m_nRotateY //每次旋轉(zhuǎn)2}CD3DWnd::Render()函數(shù),在m_pDevice->BeginScene()函數(shù)和m_pDevicem_pDevice->SetFVFD3DFVF_CUSTOMVERTEX設(shè)置自定義//繪制圖元,其中參數(shù)1為圖元格式,參數(shù)3為三角m_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);Render()最后,要禁用光照處理(默認(rèn)是打開的)。因?yàn)楸纠淌褂庙旤c(diǎn)顏色進(jìn)行渲染,如果不Drc3D只挑選三角形的正相關(guān)代碼加在函數(shù)CD3DWnd::InitD3D()圖4.27所示。4.27繪制的三角形圖繪制圓4.28圓錐數(shù)學(xué)模4.28中,A為圓錐的頂點(diǎn),B3030個(gè)分32C1點(diǎn)重復(fù)出現(xiàn)了一次,否則畫出的圓錐不完整。同理底面也由32個(gè)頂點(diǎn)組成,依次為B,C1,C30,C29,…,C1。設(shè)圓錐高為2,底面半徑為1,以圓錐中心AB(圖中的藍(lán)線)X軸,坐標(biāo)原點(diǎn)設(shè)在AB中點(diǎn),A的坐標(biāo)為(-1,0,0),則B的坐標(biāo)為(1,0,0),C1C30的坐標(biāo)為(1,sinθk,1,0,0;C1{1,0,0Direct3D中,要求頂點(diǎn)法線為單位矢量。首先定義兩個(gè)圖元的FVF,因?yàn)槭褂脽艄怃秩?,頂點(diǎn)顏色不再需要,新的FVF包括struct{D3DXVECTOR3normal;//圓錐底面的FVFstruct{ 修 CD3DWnd::InitGeometry,建立圓錐的幾何模型,具體代碼如下所示voidvoid{CUSTOMVERTEX1vertices1[32];vertices1[0].positionD3DXVECTOR31.0f0.0f0.0fAfor(inti=1;i<32;floattheta=(i-vertices1[i].normal=D3DXVECTOR3(0.0f,sin(theta),cos(theta));}sizeof(vertices1),0,D3DFVF_CUSTOMVERTEX1,D3DPOOL_DEFAULT,&m_pVB1,NULL);void*m_pVB1->Lock(0,sizeof(vertices1),(void**)&pVertices,0);memcpy(pVertices,vertices1,sizeof(vertices1));m_pVB1-CUSTOMVERTEX2vertices2[32];vertices2[0].positionD3DXVECTOR31.0f0.0f0.0fBfor(i=1;i<32;{//計(jì)算頂點(diǎn)序列C1、C30、C29、…、C1的坐標(biāo)和法線vertices2[i].position=vertices1[32-i].position;vertices2[i].normalD3DXVECTOR31.0f0.0f0.0f}sizeof(vertices2),0,D3DFVF_CUSTOMVERTEX2,D3DPOOL_DEFAULT,&m_pVB2,NUL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 手機(jī)購(gòu)機(jī)協(xié)議書
- 苗木抵債協(xié)議書
- 蘋果退款協(xié)議書
- 蜀大俠合同協(xié)議
- 認(rèn)種樹木協(xié)議書
- 讓利協(xié)議書模板
- 評(píng)估房產(chǎn)協(xié)議書
- 試管嬰兒協(xié)議書
- 布匹購(gòu)銷協(xié)議書
- 2025六枝特區(qū)公共汽車運(yùn)輸公司招聘16人備考核心題庫(kù)及答案解析
- 河北省石家莊市裕華區(qū)石家莊市第四十中學(xué)2024-2025學(xué)年七年級(jí)上學(xué)期期中地理試題(含答案)
- 手術(shù)清點(diǎn)記錄評(píng)分標(biāo)準(zhǔn)
- 中國(guó)戲曲劇種鑒賞智慧樹知到期末考試答案章節(jié)答案2024年上海戲劇學(xué)院等跨校共建
- pet薄膜生產(chǎn)工藝
- 二年級(jí)【語文(統(tǒng)編版)】語文園地一(第一課時(shí))課件
- 肝臟的營(yíng)養(yǎng)與保健知識(shí)講座
- 2024屆遼寧省撫順市名校數(shù)學(xué)九年級(jí)第一學(xué)期期末達(dá)標(biāo)檢測(cè)模擬試題含解析
- 2023年廣東省佛山市順德區(qū)小升初數(shù)學(xué)試卷(含答案)
- 富士相機(jī)使用說明書
- 區(qū)域經(jīng)濟(jì)空間結(jié)構(gòu)理論之增長(zhǎng)極理論
- 北京工商大學(xué)大一高等數(shù)學(xué)上冊(cè)期末考試卷及答案
評(píng)論
0/150
提交評(píng)論