第二章繪制三角形_第1頁
第二章繪制三角形_第2頁
第二章繪制三角形_第3頁
第二章繪制三角形_第4頁
第二章繪制三角形_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第二章:繪制三角形Introduction(序)所有的 3D 圖形都是由三角形構(gòu)成的。為什么是三角形而不是別的圖形呢?因?yàn)槿切斡性S多優(yōu)越之處,例如:繪制效率。(譯者:而且我們知道,任意不在同一條直線上的三個(gè)點(diǎn)都能構(gòu)成三角形,這對于在空間中形成某種復(fù)雜圖形是很有益處的,我的理解)所以,如果我們想得到一個(gè)矩形,最有效率的是繪制兩個(gè)相同的合并的三角形,這樣要優(yōu)于直接繪制一個(gè)矩形。所以,本教程下面將告訴你如何繪制復(fù)雜物體的最小單元:三角形。(譯者:神奇的三角形啊.)Vertices (頂點(diǎn))頂點(diǎn)(vertex)是什么?頂點(diǎn)就是3D空間中的一個(gè)點(diǎn)。例如,三角形有三個(gè)頂點(diǎn),而矩形有四個(gè)。在3D空間中,你

2、可以用三個(gè)頂點(diǎn)來指定一個(gè)三角形。想做到這些,你需要了解迪卡爾坐標(biāo)系統(tǒng)。2D Cartesian coordinate system (2D 迪卡爾坐標(biāo)系統(tǒng))下面的兩幅圖演示了2D 迪卡爾坐標(biāo)系統(tǒng)是怎樣工作的。Fig 2.1Fig 2.22D迪卡爾坐標(biāo)系統(tǒng)是很簡單的,用兩條軸x、y的值來表示點(diǎn)的位置,進(jìn)而表現(xiàn)出圖形的位置。這是初中時(shí)我們就學(xué)習(xí)過的。3D Cartesian coordinate system (3D 迪卡爾坐標(biāo)系統(tǒng))下面的兩幅圖演示了左手3D 迪卡爾坐標(biāo)系統(tǒng)是怎樣工作的。Fig 2.3Fig 2.42D坐標(biāo)系統(tǒng)只有x軸與y軸,因?yàn)樗瞧矫娴摹6?D空間里,兩個(gè)軸顯然不夠用了,所

3、以,有了第三個(gè)軸:z軸?,F(xiàn)在,我們用這三個(gè)軸就能在3D空間中表示出物體的任意位置了。這其實(shí)是很簡單的事情,我就不多說了。 3D Primitives Primitive 為“原始”之意,3D primitive 就是設(shè)備所支持的原始的類型。它包括:點(diǎn)列、線列、線代、三角形列、三角形帶 和 三角扇形。使用3D primitive 完成上述的圖形是很方便的。以后我們會用3D primitive 來繪制圖形。下面的一些例子演示了上述的各種方式:Point Lists(點(diǎn)列)Fig 2.5Line Lists(線列)Fig 2.6Line Strips(線帶)Fig 2.7Triangle Lists

4、(三角形列)Fig 2.8Triangle Strips(三角形帶)Fig 2.9Triangle Fans(三角扇形)Fig 2.10Flexible Vertex Format (FVF) (靈活頂點(diǎn)格式)Flexible的意思是“靈活的”。這里不譯為“靈活的頂點(diǎn)格式”而譯為“靈活頂點(diǎn)格式”是有原因的:前者是一個(gè)短語,像是廣告詞一樣;后者才更像是一種名詞或術(shù)語。所以,我取了后者。靈活頂點(diǎn)格式(FVF)是用來描述頂點(diǎn)屬性的一種格式,而這種格式是可以由我們自定義的,所以稱它為“靈活頂點(diǎn)格式”。至此,我們至少知道了頂點(diǎn)有三種屬性:x值、y值和z值。其實(shí)頂點(diǎn)還可以有其他屬性,例如顏色與亮度。利用靈

5、活頂點(diǎn)格式(FVF)我們能方便的指定頂點(diǎn)的屬性。如果我們在Direct3D指定了一個(gè)多邊形,這個(gè)多邊形將可以被它的各個(gè)頂點(diǎn)的屬性所填充,帶有過渡性的屬性填充。我知道這個(gè)不太好理解,沒關(guān)系,下面我們有例子,它也正是這樣做的:在我們下面的例子中,將會有一個(gè)三個(gè)頂點(diǎn)所組成的三角形,三角形的每個(gè)頂點(diǎn)的顏色都是不同的,他們分別是紅、綠、藍(lán),電腦中的三原色。三角形將會被這三種顏色混合的、漸變的填充起來。Vertex Buffers (頂點(diǎn)緩沖)頂點(diǎn)緩沖就是一塊用于保存頂點(diǎn)的內(nèi)存緩沖區(qū)。頂點(diǎn)緩沖可以保存任何的頂點(diǎn)類型。當(dāng)你的一些頂點(diǎn)已經(jīng)被保存在頂點(diǎn)緩沖區(qū)中,你就可以操作它們了,例如渲染、變換和剪裁。Colo

6、urs (顏色)在DirectX中,如果我們要指定一種顏色,我們可以用D3DCOLOR_XRGB宏。宏中有三個(gè)參數(shù),每個(gè)參數(shù)都是0到255間的整數(shù)值,分別用于描述顏色的紅、綠、藍(lán)分量,然后D3DCOLOR_XRGB宏會將它們調(diào)和,就像水彩調(diào)色一樣。例如:D3DCOLOR_XRGB(0, 0, 0) 是黑色(無色)。D3DCOLOR_XRGB(255, 255, 255) 是純白色(滿色調(diào))。D3DCOLOR_XRGB(0, 255, 0) 是亮綠色(沒有紅與藍(lán),全是綠色的分量)。D3DCOLOR_XRGB(100, 20, 100) 是暗紫色 (100 紅, 20 綠, 100 藍(lán))。好了,我

7、們第二章的例子就在這了。它和第一個(gè)例子差不多,只是添加了一些代碼、做了些修改。仔細(xì)研究吧!Its easy!#include <d3d8.h>LPDIRECT3D8 g_pD3D = NULL;LPDIRECT3DDEVICE8 g_pD3DDevice = NULL;LPDIRECT3DVERTEXBUFFER8 g_pVertexBuffer = NULL; / Buffer to hold verticesstruct CUSTOMVERTEX FLOAT x, y, z, rhw; / The transformed position for the vertex. DWO

8、RD colour; / The vertex colour.;#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)#define SafeRelease(pObject) if(pObject != NULL) pObject->Release(); pObject=NULL;HRESULT InitialiseD3D(HWND hWnd) /First of all, create the main D3D object. If it is created successfully we /should get a po

9、inter to an IDirect3D8 interface. g_pD3D = Direct3DCreate8(D3D_SDK_VERSION); if(g_pD3D = NULL) return E_FAIL; /Get the current display mode D3DDISPLAYMODE d3ddm; if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm) return E_FAIL; /Create a structure to hold the settings for our

10、 device D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp); /Fill the structure. /We want our program to be windowed, and set the back buffer to a format /that matches our current display mode d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC; d3dpp.BackBufferFormat =

11、 d3ddm.Format; /Create a Direct3D device. if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice) return E_FAIL; return S_OK;HRESULT InitialiseVertexBuffer() VOID* pVertices; /Store each point of the triangle tog

12、ether with it's colour CUSTOMVERTEX cvVertices = /Vertex 1 - Red (250, 100) 250.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), /Vertex 2 - Green (400, 350) 400.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), /Vertex 3 - Blue (100, 350) 100.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), ;

13、 /Create the vertex buffer from our device if(FAILED(g_pD3DDevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer) return E_FAIL; /Get a pointer to the vertex buffer vertices and lock the vertex buffer if(FAILED(g_pVertexBuffer->Lock(

14、0, sizeof(cvVertices), (BYTE*)&pVertices, 0) return E_FAIL; /Copy our stored vertices values into the vertex buffer memcpy(pVertices, cvVertices, sizeof(cvVertices); /Unlock the vertex buffer g_pVertexBuffer->Unlock(); return S_OK;void Render() if(g_pD3DDevice = NULL) return; /Clear the backb

15、uffer to black g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); /Begin the scene g_pD3DDevice->BeginScene(); /Rendering our triangle g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, sizeof(CUSTOMVERTEX); g_pD3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);

16、g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); /End the scene g_pD3DDevice->EndScene(); /Filp the back and front buffers so that whatever has been rendered on the /back buffer will now be visible on screen (front buffer). g_pD3DDevice->Present(NULL, NULL, NULL, NULL);void CleanUp()

17、SafeRelease(g_pVertexBuffer); SafeRelease(g_pD3DDevice); SafeRelease(g_pD3D);void GameLoop() /Enter the game loop MSG msg; BOOL fMessage; PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); while(msg.message != WM_QUIT) fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE); if(fMessage) /Process m

18、essage TranslateMessage(&msg); DispatchMessage(&msg); else /No message to process, so render the current scene Render(); /The windows message handlerLRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) switch(msg) case WM_DESTROY: PostQuitMessage(0); return 0; break; cas

19、e WM_KEYUP: switch (wParam) case VK_ESCAPE: /User has pressed the escape key, so quit DestroyWindow(hWnd); return 0; break; break; return DefWindowProc(hWnd, msg, wParam, lParam);/Application entry pointINT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT) /Register the window class WNDCLASSEX

20、wc = sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "DX Project 2", NULL; RegisterClassEx(&wc); /Create the application's window WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, GetDesktopWindow(), NULL, wc.hInstance, NULL); /Initialize Direct

21、3D if(SUCCEEDED(InitialiseD3D(hWnd) /Show our window ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); /Initialize Vertex Buffer if(SUCCEEDED(InitialiseVertexBuffer() /Start game running: Enter the game loop GameLoop(); CleanUp(); UnregisterClass("DX Project 2", wc.hInstance); return 0

22、;運(yùn)行程序,你會得到一個(gè)背景為黑色的窗口。窗口的中央是一個(gè)三角形,被三原色過渡填充的三角形,很漂亮,不是嗎?真高興,現(xiàn)在我們已經(jīng)可以繪制一些真正的圖形了。看圖來說,上面的一些東西就不難理解了。好了,下面有一幅程序運(yùn)行時(shí)的截圖:嘿嘿,添加了幾行代碼,得到了如此漂亮的圖形,不是很復(fù)雜,對吧?那末,我們都做了什么改動呢?WinMainWinMain函數(shù)作了細(xì)微的調(diào)整,就是初始化Direct3D后又調(diào)用了InitialiseVertexBuffer函數(shù)。g_pVertexBuffer這是頂點(diǎn)緩沖的指針。注意它是全局的,所以可以被所有的函數(shù)使用。這就是我們存儲三角形的頂點(diǎn)的地方了,頂點(diǎn)緩沖,對,就是那個(gè)

23、。CUSTOMVERTEX這是我們自定義的頂點(diǎn)格式,為什么能自定義呢?對!因?yàn)镈irect3D支持的靈活頂點(diǎn)格式(FVF)。其中我們都指定了x,y,z,rhw 和 顏色屬性。D3DFVF_CUSTOMVERTEX上面的CUSTOMVERTEX乃是我們自定義的頂點(diǎn)格式,但自定義也不能隨便定義,我們需要按照一定的規(guī)則,而且也需要通知DX我們的格式知怎樣定義的。所以,我們定義了這個(gè)標(biāo)識D3DFVF_CUSTOMVERTEX,它運(yùn)用了DX原有的兩個(gè)標(biāo)識D3DFVF_XYZRHW和D3DFVF_DIFFUSE(已轉(zhuǎn)換頂點(diǎn)和擴(kuò)散顏色)定義了我們自己的格式,而且,跟上面我們定義的CUSTOMVERTEX格式

24、是相吻合的。明白了嗎?也就是說:我們要按照DX支持的各種頂點(diǎn)屬性和它們的標(biāo)識來組合出我們自己需要的頂點(diǎn)格式和標(biāo)識,而標(biāo)識是用來通知DX的。InitialiseVertexBuffer這是一個(gè)新的函數(shù),你已經(jīng)猜到了:它是用來初始化定點(diǎn)緩沖的。在函數(shù)中,首先定義了一個(gè)CUSTOMVERTEX型的數(shù)組cvVertices,并按照前面我們所定義的格式輸入了三個(gè)不同的頂點(diǎn),位置不同顏色也不同。注意:在本例中,頂點(diǎn)的z值應(yīng)該在0到1之間,因?yàn)楝F(xiàn)在的程序只能支持一些2D的圖形,這樣做是為了讓程序最簡單且容易理解。不用急,以后我們就會創(chuàng)建真正的3D圖形了。然后我們利用設(shè)備借口調(diào)用了CreateVertexBuffer函數(shù)來初始化我們的頂點(diǎn)緩沖。注意第一個(gè)參數(shù)我們輸入了頂點(diǎn)緩沖的大小,因?yàn)槲覀冚斎肓巳齻€(gè)頂點(diǎn),所以是3個(gè)CUSTOMVERTEX的大小。此函數(shù)將給我們一個(gè)指向頂點(diǎn)緩沖的指針(g_pVertexBuffer)。這時(shí)我們的頂點(diǎn)緩沖已經(jīng)創(chuàng)建好了,我們應(yīng)該把我們指定好的頂點(diǎn)傳送給它:鎖定頂點(diǎn)緩沖-傳送已經(jīng)被保存的頂點(diǎn)-解除鎖定。到這

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論