DirectX3D程式設計入門教程一D3D物件及裝置(轉)

post0發表於2007-08-12
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章