DirectX3D程式設計入門教程一D3D物件及裝置(轉)
DirectX3D程式設計入門教程一D3D物件及裝置(轉)[@more@] 前言: 應幾個網友的要求,利用工作之餘,寫了一篇DirectX 3D(簡稱D3D)程式設計入門教程。該教程適用於一些剛剛涉及D3D程式設計的朋友,讀者必須有一定的C++ 和Win32的程式設計知識。對一些大蝦級的高手,這隻能使班門弄斧了,同時也非常歡迎愛好D3D程式設計的朋友和我聯絡和交流,並提出寶貴意見。 該教程基於DirectX 8.0 Graphics, 一部分內容由DirectX 8.0 SDK 英文文件翻譯而來,一部分是自己工作經驗的總結,作者對此享有著作權,讀者可任意複製和傳播,但不包含商業的用途,轉貼請註明出處。 一, D3D物件 ( D3D Object) 主要講述以下幾方面的內容: 1.關於D3D物件 微軟Direct3D時基於COM的物件和介面的,Direct3D程式設計的第一步必須建立這個物件。而且程式結束後, 你必須最後釋放該物件。 2.建立D3D物件 在DirectX8.0中,你可以用如下程式碼建立一個D3D物件: #include // 必須包含的標頭檔案 #include LPDIRECT3D8 g_lpD3D = NULL; // D3D物件指標,以後經常用到 if( NULL == (g_lpD3D=Direct3Dcreate8(D3D_SDK_VERSION) ) ) // D3D_SDK_VERSION確保該物件建立正確的標頭檔案上,目前只能用該值。 return E_FAIL; 二, D3D裝置 ( D3D Device ) 主要講述以下幾方面的內容: 1.什麼是D3D裝置? 一個D3D裝置介面可以簡單的認為是本機一塊顯示卡的抽象,它包含了顯示卡所有的硬體引數及狀態值,比如 說,顯示卡視訊記憶體的數量和起始的線性地址,是否支援深度緩衝(Depth Buffer),霧化(Fog),紋理(Texture) 及MipMap等。 2.D3D裝置的功能 在D3D程式設計中,一個D3D裝置介面主要能完成以下的功能模組: a. 轉換功能(Transformation): 主要完成對3D 模型資料的轉換,例如,世界轉換( World transformation),視轉換(View transformation),投影轉換(Projection transformation)。 b. 燈光照明功能: 完成對場景的燈光渲染,例如,設定環境光,方向光等。 c. 光柵化顯示功能: 根據設定的一些3D狀態引數和當前螢幕顯示模式以及剪下等情況,將3D圖形在螢幕 上顯示出來。 3.D3D裝置的型別 在DirectX 8.0中,支援三種型別的D3D裝置:硬體抽象層裝置,參比裝置,軟體模擬裝置,每一種裝置可 以認為是一種獨立的3D驅動程式,但也各有用途和優勢,下面詳細說明。 a. 硬體抽象層裝置 ( HAL Device):D3D中最主要的裝置型別,基於顯示卡的硬體功能,具有很快的3D硬體 加速功能,能執行硬體或軟體的頂點資料處理。缺點是必須有3D顯示卡支援( 如果你沒有足夠的錢買好 的顯示卡的話,也只能望洋興嘆了),而且,並不是每種顯示卡都支援所有的3D功能,所以在使用該裝置 時,必須經常查詢顯示卡支援的功能,對不支援的用軟體裝置來模擬。 b. 軟體模擬裝置(Software Device): 顧名思義,是用軟體的方法來模擬3D的一些功能。依賴於一些特 殊的CPU指令集( 比如,AMD 3D-Now, Intel MMX指令集), 軟體模擬裝置也能獲得較高的3D效能。而 且軟體模擬裝置具有硬體抽象層裝置一樣的函式介面,使用方便。缺點是大量佔用CPU資源,執行速度 較慢,只適合同硬體抽象層裝置配合使用。 c. 參比裝置(Reference Device):是微軟Direct3D支援的一種附加設別型別,它也依賴於特殊的CPU指令 集,但同軟體模擬裝置相比,它更注重模擬的精確性,而不是速度方面。所以它一般應用於對3D硬體 的測試和硬體功能的演示上。 4.建立D3D裝置 在DirectX 8.0中,建立一個D3D裝置需要到用IDirect3D8 介面中的CreateDevice函式,該函式原型如下 HRESULT CreateDevice( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice8** ppReturnedDeviceInterface ); 函式引數說明可以查詢DirectX 8.0 SDK 的文件,不過是英文的,下面給出一段程式碼說明: // 該段程式碼建立一個基於Window視窗程式的D3D硬體抽象層裝置,採用軟體的頂點資料處理,並使用16Bits 的深度緩衝區。 D3DDISPLAYMODE d3ddm; HRESULT hr = 0; hr = g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ); if( FAILED(hr) ) return E_FAIL; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; // 指明是視窗模式,而非全域性獨佔模式 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 無需交換鏈 d3dpp.BackBufferFormat = d3ddm.Format; // 後備緩衝區顏色格式 d3dpp.EnableAutoDepthStencil = TRUE; // 使深度緩衝區有效 d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 深度緩衝區顏色格式 // Create the D3D Device hr = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, // 使用當前顯示卡作注裝置 D3DDEVTYPE_HEL, // 裝置型別 hWnd, // 該程式所在的視窗控制程式碼 D3DCREATE_SOFTWARE_VERTEXPROCESSING, // 用軟體的方法處理頂點資料 &d3dpp, // 指向上面的結構 &g_pd3dDevice ) ) ) // 指向3D裝置的指標 if( FAILED(hr) ) { return E_FAIL; } 該節內容講完了,如果看完後你覺得頭暈眼花,不知所云的話,也是很正常的,因為有好多的3D圖形概念我們還沒有提及到,在以下的章節裡,我回一一為大家介紹
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-952124/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#快速入門教程(1)——物件導向程式設計C#物件程式設計
- TCSHshell程式設計入門(轉)程式設計
- Postman安裝及入門教程Postman
- 物件導向程式設計入門 - Janos Pasztor物件程式設計
- 全網最適合入門的物件導向程式設計教程:01 物件導向程式設計的基本概念物件程式設計
- 全網最適合入門的物件導向程式設計教程:00 物件導向設計方法導論物件程式設計
- 函數語言程式設計入門教程函數程式設計
- Linux程式設計入門-crypt(轉)Linux程式設計
- Python程式設計入門(1) (轉)Python程式設計
- Python程式設計入門(3) (轉)Python程式設計
- Python程式設計入門(4) (轉)Python程式設計
- Python程式設計入門(6) (轉)Python程式設計
- Python程式設計入門(7) (轉)Python程式設計
- Python程式設計入門(8) (轉)Python程式設計
- 程式設計“初學者”入門指南 (轉)程式設計
- Linux程式設計入門-gpm(轉)Linux程式設計
- Linux程式設計入門 - crypt(轉)Linux程式設計
- JAVA NIO程式設計入門(一)Java程式設計
- BCSphere入門教程03:掃描周圍裝置
- C#程式設計基礎入門教程pdfC#程式設計
- Linux裝置驅動開發詳解:入門與程式設計實踐Linux程式設計
- 神經網路程式設計入門【轉】神經網路程式設計
- Linux程式設計入門 - Dialog(轉)Linux程式設計
- Linux程式設計入門 - SVGALIB(轉)Linux程式設計SVG
- 程式設計師程式設計入門,物件導向需要知道這6點!程式設計師物件
- linux程式設計之一:入門Linux程式設計
- Linux核心程式設計(字元裝置檔案)(轉)Linux程式設計字元
- Python入門教程100天:Day08-物件導向程式設計基礎Python物件程式設計
- Javascript 物件導向程式設計(一):封裝JavaScript物件程式設計封裝
- Python函數語言程式設計入門教程Python函數程式設計
- Python基礎入門(6)- 物件導向程式設計Python物件程式設計
- 微信小程式入門教程之三:指令碼程式設計微信小程式指令碼程式設計
- 入門程式碼程式設計程式設計
- Netty-架構設計及入門程式-3Netty架構
- Mac 入門教程:如何更改你的 Mac 裝置名稱Mac
- Linux網路程式設計入門 (轉載)Linux程式設計
- windows網路程式設計經典入門 (轉)Windows程式設計
- Java多執行緒程式設計入門(轉)Java執行緒程式設計