目前大部分遊戲通過Direct3D實現3D效果,通過掛鉤相應函數,可以實現3D透視,屏幕掛字效果。而透視,屏蔽特定效果,設置透明在很多遊戲(特別是FPS)中發揮着巨大的作用!
D3D
DirectX的功能都是以COM組件的形式提供的。在Direct3D中,主要通過採取以下操作來實現編程:
調用適當的函數獲取接口指針;
調用接口的方法(成員函數)來完成所需功能;
用完接口後,調用Release方法進行“釋放”,注意釋放順序應該和獲取它們的順序相反。
D3D的實現流程:
大體可以分爲:設計,渲染和顯示三個部分。通過設計物體的頂點,貼圖,材質等信息,並將座標轉換爲屏幕座標後,調用渲染方式,根據座標變化,材質文理等計算亮度,進行背面消除,裁剪,投影和視口計算,最後在後備緩衝中繪製好圖形交換到當前緩衝區。
基礎知識
圖元
在d3d編程中,所有的圖形都是由圖元組成的,例如:
這些圖元分爲點列,線列,線帶,三角形列,三角形帶,三角扇形
頂點緩存
頂點緩存通常除頂點座標之外還包括法線,顏色,紋理等數據。
索引緩存
索引緩存就是將頂點的具體數據和代表圖元格式的頂點順序分開存儲:頂點數據仍然放到頂點緩存區中,索引緩存區則按照圖元格式,順序存放頂點的索引。
例如:
A,B,C,D對應的頂點緩存索引爲0 1 2 3,按照三角形的列的組成順序,把頂點索引值存入索引緩存區,4個三角形分別爲△ACB、△ADC、△ABD、△BCD(注意頂點排列順序和可視面的關係),則索引序列爲0 2 1 0 3 2 0 1 3 1 2 3。這樣原本要用12個頂點數據構建一個三棱錐,使用索引緩存後,只需要4個。
Z緩存
在Direct3D中,使用深度緩存區(Depth Buffer)來進行消隱處理(隱藏面消除),以確保實體被遮擋的部分不被顯示。Z緩存是最常用的一種深度緩存,它因爲用Z座標作爲判斷深度(遠近)的依據而得名,其工作原理如圖14所示,圖中的渲染表面相當於Direct3D窗口,Z緩存用來保存窗口中各個像素的深度。在消隱時,Direct3D先用背景色(或紋理)填充渲染表面,Z緩存則統一設置成最大深度,即投影變換中後裁剪平面的距離,然後逐像素處理渲染表面:對於任意一個像素,Direct3D逐一測試所有與該像素重疊的三角形,如果三角形中像素對應點的Z座標小於Z緩存中的數值,也就是說,此三角形離觀察者較近,則像素取該點的顏色,同時像素在Z緩存中的深度也設爲該點的Z座標,然後繼續測試下一個三角形… …
座標變換
- 全局轉換: 將所有的物體轉換爲統一的全局座標,你還可以在這裏完成各種對物體位置的操作。
- 視圖轉換:轉爲從觀察者(玩家)角度看到的全局座標。先在全局座標系的指定位置架一臺攝影機,指定一個注視點和一個參考點。座標將被轉換到以攝影機爲原點,從原點到 注視點爲Z軸,再加上參考點,所確定的平面爲Y-Z平面的座標系中。實際上就是把全局座標擰了個兒。
- 透視轉換:前兩種座標轉換並無本質區別,有些情況就把它們合爲一個。而經過透視轉換,各頂點的X,Y值將表示實際的屏幕座標,而Z值就是Z-Buffer裏用到的深度信息。
渲染
在Direct3D中,一個設備對象至少包含兩個顯示緩存區:當前緩存區(Front Buffer)和後備緩存區(Back Buffer),前者可以看成Direct3D窗口的映射。當我們渲染圖形時,實際上並不是直接在窗口上輸出,而是在後備緩存區上繪圖。渲染完畢後,交換兩個緩存區,使原來的後備緩存區變成當前緩存區,從而實現窗口刷新。快速重複此過程,就會在屏幕上形成連續的動畫
有了上述的一些基本概念之後,我們就可以編寫出自己的d3d Demo:
D3D Hack
通過上述瞭解,我們發現渲染中有個函數SetRenderState()可以設置渲染狀態,通過設置不同的參數既可以實現我們想要的功能:
透視:SetRenderState(D3DRS_ZENABLE, FALSE)
去除煙霧:
SetRenderState(D3DRS_FOGENABLE, FALSE)
設置多邊形填充模式:
SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME) //線填充模式,
D3D在多邊形的每個邊繪製一條線
具體代碼見D3D demo
未完待續