天天看點

DXUT 架構入門 1

 DXUT 架構入門 1 CD3DApplication 架構類已經光榮的退役了,取而代之的是DXUT*系列函數。在這篇文章中将要簡單介紹DXUT架構的應用。 最近的directx 下載下傳位址, 這裡面包含了64位作業系統庫以及directx10等等,directx10 的程式例子隻能運作在windows vista 上面。盡管可以編譯,但缺少directx3d10 運作庫. 在安裝sdk之後,别忘記安裝Redist目錄中最新的directx運作庫。 在vc.net->tools->options中配置頭檔案以及庫檔案位址。

DXUT 架構入門 1

使用dxut架構進行directx設計時,拷貝directx sdk 安裝目錄/Samples/C++/中的Common檔案内容到你的程式目錄下(如下圖)。

DXUT 架構入門 1

建立一個名為dxut 的windows apllication 空工程,然後在vc solution explorer 中項目下加入common目錄(添加存在檔案,注意dxsound兩個檔案沒有加入),然後添加一個源檔案main.cpp

DXUT 架構入門 1

然後在vc solution explorer 中項目上點右鍵進入項目屬性頁(property pages)加入附加的common目錄作為附加頭檔案搜尋目錄,同樣在屬性頁的 linker->input->addtional dependencies 中加入 dxerr.lib dxguid.lib d3dx9.lib d3d9.lib winmm.lib comctl32.lib 等連結庫

DXUT 架構入門 1

main.cpp 源檔案内容如下:

#include <dxstdafx.h>

//--------------------------------------------------------------------------------------

// 當Directx3D裝置被建立後,這個回調函數馬上被調用,因為D3DPOOL_MANAGED資源在裝置被銷毀後

// 需要重新裝載,這裡是最佳建立D3DPOOL_MANAGED資源的地方,建立的資源應在 OnDestroyDevice 

// 函數中銷毀 。

//--------------------------------------------------------------------------------------

HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )

{

 return S_OK;

}

//--------------------------------------------------------------------------------------

// 當direct3d裝置被複位後,這個函數立即被調用,這裡最好放置D3DPOOL_DEFAULT 資源代碼,因為這

// 這些資源在裝置丢失後需要重新裝載。在這裡建立的資源應該在OnLostDevice 函數中釋放

//--------------------------------------------------------------------------------------

HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )

{

 return S_OK;

}

//--------------------------------------------------------------------------------------

// 在Direct3D裝置進入lost狀态後在IDirect3DDevice9::Reset 調用之前調用此函數,在OnResetDevice 

// 中建立的資源必須在這裡釋放,通常包括所有的D3DPOOL_DEFAULT 資源,

//--------------------------------------------------------------------------------------

void CALLBACK OnLostDevice( void* pUserContext )

{

}

//-------------------------------------------------------------------------------------- //這個回調函數在每幀的開始被調用,這個在你的程式中用來處理場景更新最好的位置,但不能包含實際的 //場景渲染調用,渲染工作應該放在OnFrameRender 回調函數中。 常用于矩陣轉換、錄影機 等操作。 //--------------------------------------------------------------------------------------

void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )

{ }

//-------------------------------------------------------------------------------------- //此回調函數在每Frame最後被調用,在場景上執行所有的渲染調用,當視窗需要重繪(處理WM_PAINT消 //息)時此函數也會被調用(此時不調用OnFrameMove),在此函數傳回後,DXUT将調用 //IDirect3DDevice9::Present 來顯示翻轉鍊中下一個緩沖區内容。 //--------------------------------------------------------------------------------------

void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )

{

 HRESULT hr;

 V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0) );

 if(SUCCEEDED(pd3dDevice->BeginScene()))

 {

  //更新圖像

  pd3dDevice->EndScene();

 }

} //-------------------------------------------------------------------------------------- //此回調函數在direct3d裝置被銷毀時調用,通常發生在程式終止,在OnCreateDevice 中建立的資源,要 //在這裡釋放,通常包含所有的D3DPOOL_MANAGED資源 //IDirect3DDevice9::Present 來顯示翻轉鍊中下一個緩沖區内容。 //--------------------------------------------------------------------------------------

void CALLBACK OnDestroyDevice( void* pUserContext )

{

} INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )

{

 // 設定回調函數,這些函數允許DXUT通知應用程式更換裝置,使用者輸入和視窗消息。

 // 回調函數是可選的,是以你要做的僅是設定你感興趣的事件的回調函數。

 DXUTSetCallbackDeviceCreated( OnCreateDevice );

 DXUTSetCallbackDeviceReset( OnResetDevice );

 DXUTSetCallbackDeviceLost( OnLostDevice );  DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );

 DXUTSetCallbackFrameRender( OnFrameRender );

 DXUTSetCallbackFrameMove( OnFrameMove );

 // 初始化DXUT并建立想要的Win32視窗和應用程式的Direct3D裝置。調用這些

 // 可選函數中的每一個,此外它們允許你設定幾個選項來控制架構的行為。

 DXUTInit( TRUE, TRUE, TRUE );  //directx 編碼是unicode環境,是以字元串之前要加 L 。

 DXUTCreateWindow( L"Welcome to topameng.spaces.live.com" );

 DXUTCreateDevice( D3DADAPTER_DEFAULT, TRUE, 640, 480 );  // 通過DXUT來處理消息循環并分派渲染調用。當在空閑時間和處理視窗消息的

 // 時間間隔時,架構将調用OnFrameMove和OnFrameRender回調函數。

 DXUTMainLoop();

 return DXUTGetExitCode(); }

direct3d Memory Pools(記憶體池)

表面和其它一些D3D資源被放在多種記憶體池中。記憶體池的種類由D3DPOOL枚舉類型的一個成員來指定。它可以為下列幾種:

1.D3DPOOL_DEFAULT——表示D3D将根據資源的類型和用途把它們放在最合适的地方。這有可能是顯存、AGP記憶體或者系統記憶體中。值得注意的是,這種記憶體池中的資源必須要在IDirect3DDevice9::Reset被調用之前消毀掉,然後必須重新初始化。

2.D3DPOOL_MANAGED——資源将由D3D管理并且按裝置的需要來指定放在顯存還是放在AGP記憶體中,同時備份這些資源到系統記憶體中。當應用程式通路和改變資源,也會對系統記憶體造成影響。

3.D3DPOOL_SYSTEMMEM——指定資源放在系統記憶體中。

4.D3DPOOL_SCRATCH——規定資源放在系統記憶體中,它與D3DPOOL_SYSTEMMEM不同之處在于使用這個參數使圖形裝置不能通路本記憶體池的資源,但資源可以被複制出去。 也可以打開direct sdk 安裝目錄Samples/C++/Direct3D/EmptyProject  例子,基本和上面是相同的

繼續閱讀