DXUT 架構入門 1 CD3DApplication 架構類已經光榮的退役了,取而代之的是DXUT*系列函數。在這篇文章中将要簡單介紹DXUT架構的應用。 最近的directx 下載下傳位址, 這裡面包含了64位作業系統庫以及directx10等等,directx10 的程式例子隻能運作在windows vista 上面。盡管可以編譯,但缺少directx3d10 運作庫. 在安裝sdk之後,别忘記安裝Redist目錄中最新的directx運作庫。 在vc.net->tools->options中配置頭檔案以及庫檔案位址。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLigjd45EVvZEWMpWVEhjc0MmdzdVS2B1T5tWULZFM6lVcxwGVrZDdtpWYwV3XK1mdLlzZHZEeVhTewl2ZEZ3QodjYWlFUwkETDR1cr9kehpmerZGW2hmcBhTb0oUSaZGaE5kMaNDM5J3QPVEc3cWVqVTRfpEOa9mcrJ0SSJndEdXU1FFdtllVxgHe1lEcxg3Lc12bj5ibz1mLldWYy9Gdz5yclxWamtGdvw1LcpDc0RHaiojIsJye.jpg)
使用dxut架構進行directx設計時,拷貝directx sdk 安裝目錄/Samples/C++/中的Common檔案内容到你的程式目錄下(如下圖)。
建立一個名為dxut 的windows apllication 空工程,然後在vc solution explorer 中項目下加入common目錄(添加存在檔案,注意dxsound兩個檔案沒有加入),然後添加一個源檔案main.cpp
然後在vc solution explorer 中項目上點右鍵進入項目屬性頁(property pages)加入附加的common目錄作為附加頭檔案搜尋目錄,同樣在屬性頁的 linker->input->addtional dependencies 中加入 dxerr.lib dxguid.lib d3dx9.lib d3d9.lib winmm.lib comctl32.lib 等連結庫
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 例子,基本和上面是相同的