DirectX 圖形介面指南(2) (轉)

worldblog發表於2007-12-12
DirectX 圖形介面指南(2) (轉)[@more@]

指南一:建立裝置:namespace prefix = o ns = "urn:schemas--com::office" />

為了使用 Microsoft Direct3D,你首先需要建立一個應用視窗,並緊接著建立和初始化 Direct3D 。你應該使用這些物件提供的 介面來操縱它們,以及建立描繪一個場景所必需的其它物件。本指南包含的 CreateDevice 示例將例示並說明以下幾個工作:建立 Direct3D 裝置並且繪製一個簡單的藍色螢幕。

這個指南使用以下步驟:初始化 Direct3D,繪製場景,以及最後清理與關閉。

 

·步驟一:建立一個視窗

·步驟二:初始化 Direct3D

·步驟三:處理訊息

·步驟四:繪製與顯示場景

·步驟五:關閉與清除

 

注意:CreateDevice 示例程式的路徑在:

(SDK )SamplesMultimediaDirect3DTutorialsTut01_CreateDevice.

 

步驟一:建立一個視窗

任何 Microsoft 程式中必須要作的第一件事就是建立一個應用程式視窗並將其顯示給。為做到這點,CreateDevice 例程將首先實現它的 WinMain 。以下示例程式碼完成了視窗的初始化。

 

INT WIN WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )

{

  // Register the window class.

  WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,

  GetModuleHandle(NULL), NULL, NULL, NULL, NULL,

  "D3D Tutorial", NULL };

  RegisterClassEx( &wc );

 

  // Create the application's window.

  HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",

  WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,

  GetDesktopWindow(), NULL, wc.hInstance, NULL );

 

前述示例程式碼是標準的 Windows 。例子開始時定義和註冊了一個視窗類名為 "D3D Tutorial"。類註冊以後,示例程式碼使用已註冊的類建立了一個基本的頂層(top-level)視窗,客戶區域為 300 畫素寬,300 像數高。這個視窗沒有選單或子視窗。示例使用了 WS_OVERLAPPEDWINDOW 屬性建立一個包括最大化,最小化,以及關閉按鈕的普通視窗。(如果該例程將執行在全屏下,首選的視窗屬性應該是WS_EX_TOPMOST,它指定建立的視窗置於並且保持在所有非最高(non-topmost)視窗之前,甚至在視窗失活的情況下。)一旦視窗建立完成,例程式碼標準的 Microsoft 函式顯示和視窗。

 

在應用程式視窗準備好以後,你就能開始設定具體的 Microsoft Direct3D 物件了,

請見:步驟二:初始化 Direct3D

 

步驟二:初始化 Direct3D

 

CreateDevice 示例在 WinMain 中建立視窗之後,呼叫該程式定義的函式 InitD3D 完成 Microsoft Direct3D 初始化過程。在建立視窗之後,程式已經準備好初始化你將用來繪製場景的 Direct3D 物件了。這個過程包括建立一個 Direct3D 物件,設定Present Parameters,以及最後建立 Direct3D 裝置。

 

建立完 Direct3D 物件之後,你可以立即使用 IDirect3D8::CreateDevice 方法建立 Direct3D 裝置。你也能夠使用 Direct3D 物件列舉裝置,型別,模式以及其他東西。這些工作的程式碼段應位於使用 Direct3DCreate8 函式建立 Direct3D 物件之後。

 

if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )

  return E_FAIL;

 

傳遞給 Direct3DCreate8 的唯一引數應該始終是 D3D_SDK_VERSION,它告訴 Direct3D 當前使用的頭資訊。無論如何,標頭檔案或者其他的變化將導致這個值增加並強制使用該值的應用程式重新編譯。如果此版本不匹配,呼叫 Direct3DCreate8 將失敗。

 

下一個步驟是使用 IDirect3D8::GetAdapterDisplayMode 介面找到當前的顯示模式,程式碼如下:

 

D3DDISPLAYMODE d3ddm;

if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )

  return E_FAIL;

 

D3DDISPLAYMODE 結構中的 Format 變數將被用於建立 Direct3D 裝置。如果是執行於視窗模式下的話,Format 引數通常用來建立一個與介面卡當前模式相匹配的後背緩衝 (Back buffer)。

 

在給 D3DPRESENT_PARAMETERS 各引數賦值時,你必須指定你的應用程式在3D下工作的方式。本 CreateDevice 例程設定D3DPRESENT_PARAMETERS結構中 Windowed 為 TRUE,SEffect 為 D3DSWAPEFFECT_DISCARD,BackBufferFormat 為 d3ddm.Format。

 

D3DPRESENT_PARAMETERS d3dpp;

ZeroMemory( &d3dpp, sizeof(d3dpp) );

d3dpp.Windowed  = TRUE;

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

d3dpp.BackBufferFormat = d3ddm.Format;

 

最後一步,是利用 IDirect3D8::CreateDevice 函式建立 Direct3D 裝置,程式碼如下:

 

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

   D3DCREATE_SOFTWARE_VERTEXPROCESSING,

  &d3dpp, &g_pd3dDevice ) ) )

 

前述程式碼使用 D3DADAPTER_DEFAULT 標誌建立了一個使用省缺介面卡的裝置。在非常多數的情況下,系統只有一個介面卡,除非它了多個圖形加速卡。透過把 DeviceType 引數設成 D3DDEVTYPE_HAL,表示你希望獲得一個實際裝置 (hardware device) 而不是虛擬裝置 (software device)。示例程式碼還使用 D3DCREATE_SOFTWARE_VERTEXPROCESSING 標誌通知系統使用軟體頂點處理 (software vertex processing)。注意,如果你指定 D3DCREATE_HARDWARE_VERTEXPROCESSING 標誌通知系統使用硬體頂點處理 (hardware vertex processing),你可以在支援硬體頂點處理的圖形加速卡上得到大幅度的提升。

 

現在 Direct3D 已經初始化完畢,下一步是確保你的程式具有一個機制用來來處理系統訊息,

見下文:步驟三:處理系統訊息

 

步驟三:處理系統訊息

 

完成建立程式視窗以及初始化 Direct3D 以後,你已經準備好繪製場景 (Render scene)。大多數情況下,Microsoft Windows 程式在它們的訊息迴圈裡監視系統訊息,並且在佇列裡沒有訊息時繪製畫面幀。然而,CreateDevice 例程僅僅在等到一個WM_PAINT出現在佇列裡時,才通知應用程式重繪視窗的所有部分。

 

// The message l.

MSG msg;

while( GetMessage( &msg, NULL, 0, 0 ) )

{

  TranslateMessage( &msg );

  DispatchMessage( &msg );

}

 

當每迴圈一次,DispatchMessage 呼叫 MsgProc,後者負責處理佇列裡的訊息,當 WM_PAINT 訊息進隊時,呼叫該程式自身定義的函式 Render(),它將負責重繪視窗。然後 Microsoft Win32 函式 ValidateRect 執行並將整個客戶區域設為有效。

 

訊息處理函式的例程式碼如下:

 

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )

{

  switch( msg )

  {

  case WM_DESTROY:

  PostQuitMessage( 0 );

  return 0;

 

  case WM_PAINT:

  Render();

  ValidateRect( hWnd, NULL );

  return 0;

  }

 

  return DefWindowProc( hWnd, msg, wParam, lParam );

}

 

現在,應用程式處理了系統訊息,接著的一步是繪製顯示,見:步驟四:繪製與顯示場景

 

步驟四:繪製與顯示場景

 

為了描繪和顯示需要的場景,本例程在這一步把後背緩衝 (back buffer) 填充為藍色,然後將此後背緩衝的內容傳給前景緩衝 (front buffer), 並且將前景緩衝提交至螢幕。

 

清除表面,應呼叫 IDirect3DDevice8::Clear 函式:

 

// Clear the back buffer to a blue color

g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

 

Clear() 接受的前兩個引數通知 Microsoft Direct3D 被清除的矩形區域陣列的基址和大小,該矩形區域陣列描述了繪製目標表面 (render target surface) 裡需要清除的區域。

 

在大多數情況下,只使用單個矩形覆蓋整個繪製目標表面。這樣你只需設定第一個引數為 0 及第二個引數為 NULL。第三個引數將決定方法的行為,你可以透過設定特定的標誌用來清除繪製目標表面 (render target surface),關聯的Z緩衝 (associated depth buffer),模版緩衝 (stencil buffer),以及任意這三者的混合。本指南不使用Z緩衝,所以僅僅使用了 D3DCLEAR_TARGET 標誌。最後三個引數分別用於設定對應繪製目標表面、Z緩衝和模版緩衝的清除填充值 (reflect clearing values)。該 CreateDevice 例程將繪製目的表面的清除填充色設定為藍色 (D3DCOLOR_XRGB(0,0,255)。由於相應的標誌沒有設定,最後兩個引數被 Clear() 忽略。

 

在清除了視口 (viewport) 之後,CreateDevice 例程告知 Direct3D 繪圖將要開始,然後立即通知這次繪製完成,見以下程式碼段:

 

// Begin the scene.

g_pd3dDevice->BeginScene();

 

// Rendering of scene s happens here.

 

// End the scene.

g_pd3dDevice->EndScene();

 

當繪製開始或完成時,IDirect3DDevice8::BeginScene 和 IDirect3DDevice8::EndScene 函式將用訊號通知系統。你只能在這兩函式之間呼叫其它的繪圖函式。即使呼叫繪圖函式失敗,你也應該在重新呼叫 BeginScene 之前呼叫 EndScene。

 

繪製完之後,呼叫 IDirect3DDevice8::Present顯示該場景:

 

g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

 

Present() 接受的前兩個引數是原始矩形和目標矩形。在這一步,例程設定這兩個引數為 NULL 並把整個後備緩衝提交到前景緩衝。第三個引數用於設定該次提交的目標視窗。因為這個引數被設為 NULL,實際使用的視窗是 D3DPRESENT_PARAMETERS 的 hWndDeviceWindow 成員。第四個是 DirtyRegion 引數,在絕大多數情況下應該設為 NULL。

 

本指南的最終步驟是關閉應用程式,見:步驟五:關閉與清除

 

步驟五:關閉與清除

 

在執行的若干時刻,你的應用程式必須立即關閉。關閉一個 Direct3D 應用程式中不只是意味著你必須銷燬程式視窗,並且你還要釋放程式中使用過的的任何 Direct3D 物件並且無效化它們的指標。當收到一個 WM_DESTROY 訊息時,CreateDevice 例程透過呼叫一個本地定義的函式 Cleanup() 來處理這些工作。

 

VOID Cleanup()

{

  if( g_pd3dDevice != NULL)

  g_pd3dDevice->Release();

  if( g_pD3D != NULL)

  g_pD3D->Release();

}

 

上述函式對每個物件呼叫 IUnknown::Release 方法來釋放它們自身。由於遵循 COM 規則,大多數物件當其引用計數降為0時,DirectX會自動的從中釋放這個物件。

 

對於其他關閉程式情況,可能發生在程式的平常執行中——比如使用者改變了桌面的引數或色深——此時你可能需要撤銷和重建使用中的 Microsoft Direct3D 物件。因此一個好的主意就是將你的釋放程式碼放到一起,以便能在需要時隨時呼叫它。

 

本指南已經說明了如何建立一個裝置,指南二:演示頂點(Render Vertex) ,將告訴你如何用頂點(Vertex)建立幾何形體。

 

(指南二:演示頂點 見本文第三部分...)

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992154/,如需轉載,請註明出處,否則將追究法律責任。

相關文章