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

下載本文檔

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

文檔簡介

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

2、可以用三個頂點來指定一個三角形。想做到這些,你需要了解迪卡爾坐標系統(tǒng)。2D Cartesian coordinate system (2D 迪卡爾坐標系統(tǒng))下面的兩幅圖演示了2D 迪卡爾坐標系統(tǒng)是怎樣工作的。Fig 2.1Fig 2.22D迪卡爾坐標系統(tǒng)是很簡單的,用兩條軸x、y的值來表示點的位置,進而表現(xiàn)出圖形的位置。這是初中時我們就學習過的。3D Cartesian coordinate system (3D 迪卡爾坐標系統(tǒng))下面的兩幅圖演示了左手3D 迪卡爾坐標系統(tǒng)是怎樣工作的。Fig 2.3Fig 2.42D坐標系統(tǒng)只有x軸與y軸,因為它是平面的。而在3D空間里,兩個軸顯然不夠用了,所

3、以,有了第三個軸:z軸?,F(xiàn)在,我們用這三個軸就能在3D空間中表示出物體的任意位置了。這其實是很簡單的事情,我就不多說了。 3D Primitives Primitive 為“原始”之意,3D primitive 就是設(shè)備所支持的原始的類型。它包括:點列、線列、線代、三角形列、三角形帶 和 三角扇形。使用3D primitive 完成上述的圖形是很方便的。以后我們會用3D primitive 來繪制圖形。下面的一些例子演示了上述的各種方式:Point Lists(點列)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) (靈活頂點格式)Flexible的意思是“靈活的”。這里不譯為“靈活的頂點格式”而譯為“靈活頂點格式”是有原因的:前者是一個短語,像是廣告詞一樣;后者才更像是一種名詞或術(shù)語。所以,我取了后者。靈活頂點格式(FVF)是用來描述頂點屬性的一種格式,而這種格式是可以由我們自定義的,所以稱它為“靈活頂點格式”。至此,我們至少知道了頂點有三種屬性:x值、y值和z值。其實頂點還可以有其他屬性,例如顏色與亮度。利用靈

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論