青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

DXUT框架剖析(1)

DXUT(也稱sample framework)是建立在Direct3D API之上的Direct3D應(yīng)用程序框架,有了DXUT這樣一個(gè)Direct3D程序框架,只需在這個(gè)框架的基礎(chǔ)上編寫相應(yīng)的代碼,從而簡化了windows和Direct3D API的使用,可以高效地進(jìn)行Direct3D程序設(shè)計(jì)。

 

生成一個(gè)Direct3D程序框架

第一步,運(yùn)行Direct3D示例程序?yàn)g覽器:

 

第二步,單擊"EmptyProject"中的"Installl Project"安裝工程:

 

第三步,在彈出的對話框中輸入新工程的名稱,修改該工程的創(chuàng)建路徑,單擊Install即可創(chuàng)建工程:

 

第四步,系統(tǒng)將自動完成工程的創(chuàng)建,然后彈出對話框詢問是否查看創(chuàng)建的工程文件夾中的內(nèi)容:

若選擇是,則可以查看新創(chuàng)建的工程文件夾的內(nèi)容:

使用Direct3D程序框架

通過上面的操作,Direct3D已經(jīng)為我們創(chuàng)建好了一個(gè)應(yīng)用程序框架,該框架主要包括以下文件:

其中最主要的兩個(gè)文件是DXUT.h和DXUT.cpp。

除了上面這些通用文件外,Direct3D還生成了一個(gè)主程序文件,該文件的名字和工程名字相同,在此即是AppFrame.cpp。該文件主要由以下幾個(gè)回調(diào)函數(shù)構(gòu)成:

bool CALLBACK IsD3D9DeviceAcceptable(D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, 
bool bWindowed, void* pUserContext);
bool CALLBACK ModifyDeviceSettings(DXUTDeviceSettings* pDeviceSettings, void* pUserContext);
HRESULT CALLBACK OnD3D9CreateDevice(IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
void* pUserContext);
HRESULT CALLBACK OnD3D9ResetDevice(IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
void* pUserContext);
void CALLBACK OnFrameMove(double fTime, float fElapsedTime, void* pUserContext);
void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 
bool* pbNoFurtherProcessing, void* pUserContext );
void CALLBACK OnD3D9LostDevice( void* pUserContext );
void CALLBACK OnD3D9DestroyDevice( void* pUserContext );

函數(shù)名前使用"CALLBACK"表示聲明的是一個(gè)回調(diào)函數(shù),也就是說,這是DXUT框架為我們設(shè)置好的接口,DXUT框架將在合適的時(shí)機(jī)調(diào)用相應(yīng)的回調(diào)函數(shù)。現(xiàn)在我們需要做的就是在這些回調(diào)函數(shù)中填寫相應(yīng)的代碼完成所需要的功能。為了使DXUT框架能夠調(diào)用這些回調(diào)函數(shù),還需要在WinMain函數(shù)中為DXUT框架設(shè)置這些回調(diào)函數(shù),代碼如下:

    // Set the callback functions
DXUTSetCallbackD3D9DeviceAcceptable(IsD3D9DeviceAcceptable);
DXUTSetCallbackD3D9DeviceCreated(OnD3D9CreateDevice);
DXUTSetCallbackD3D9DeviceReset(OnD3D9ResetDevice);
DXUTSetCallbackD3D9FrameRender(OnD3D9FrameRender);
DXUTSetCallbackD3D9DeviceLost(OnD3D9LostDevice);
DXUTSetCallbackD3D9DeviceDestroyed(OnD3D9DestroyDevice);
DXUTSetCallbackDeviceChanging(ModifyDeviceSettings);
DXUTSetCallbackMsgProc(MsgProc);
DXUTSetCallbackFrameMove(OnFrameMove);

 

DXUT框架程序的整個(gè)“生命周期”可劃分為三個(gè)階段:啟動、運(yùn)行和結(jié)束。

第一階段:啟動

DXUT框架依次執(zhí)行IsD3D9DeviceAcceptable()、ModifyDeviceSettings()、OnD3D9CreateDevice()、OnD3D9ResetDevice()這4個(gè)函數(shù)。

在創(chuàng)建某個(gè)Direct3D渲染設(shè)備之前,如果需要對渲染設(shè)備的特征進(jìn)行檢查,查看設(shè)備是否支持需要的功能,可將檢查代碼寫在函數(shù)IsD3D9DeviceAcceptable()中。

在某個(gè)渲染設(shè)備創(chuàng)建之前,如果需要修改該渲染設(shè)備的設(shè)置,可將代碼寫在函數(shù)ModifyDeviceSettings()中。DXUT框架接下來就根據(jù)設(shè)置(或者是默認(rèn)設(shè)置)創(chuàng)建最適合當(dāng)前硬件的Direct3D渲染設(shè)備。例如,當(dāng)硬件不支持某些功能時(shí),可以通過使用參考設(shè)備進(jìn)行模擬,設(shè)置使用參考設(shè)備代碼通常寫在該函數(shù)中。

DXUT框架創(chuàng)建了Direct3D設(shè)備之后,接下來會調(diào)用OnD3D9CreateDevice()回調(diào)函數(shù),可在OnD3D9CreateDevice()回調(diào)函數(shù)中創(chuàng)建所有內(nèi)存池類型為D3DPOOL_MANAGED或D3DPOOL_SYSTEMMEM的資源。以類型D3DPOOL_MANAGED創(chuàng)建的設(shè)備由Direct3D系統(tǒng)代替管理(位于顯存或系統(tǒng)內(nèi)存中),以類型D3DPOOL_SYSTEMMEM創(chuàng)建的設(shè)備位于系統(tǒng)內(nèi)存中,在程序退出之前,這些資源常駐內(nèi)存,不會出現(xiàn)設(shè)備丟失的現(xiàn)象。也就是說,以這兩種內(nèi)存類型創(chuàng)建的資源不需要程序員進(jìn)行管理。

DXUT框架在調(diào)用OnD3D9CreateDevice()回調(diào)函數(shù)之后,將調(diào)用OnD3D9ResetDevice()回調(diào)函數(shù)。我們可在函數(shù)OnD3D9ResetDevice()中創(chuàng)建所有內(nèi)存池類型為D3DPOOL_DEFAULT的資源,這一類資源將盡可能存放在顯存中,這樣可以提高程序的運(yùn)行速度。但是,這類資源在程序運(yùn)行時(shí)會出現(xiàn)設(shè)備丟失的現(xiàn)象,因此需要程序員自己管理。在設(shè)備丟失時(shí)釋放它的內(nèi)存,當(dāng)設(shè)備恢復(fù)時(shí)重新為它分配內(nèi)存。此外,觀察變換矩陣和投影變換矩陣以及在整個(gè)程序運(yùn)行期間保持不變的渲染狀態(tài)通常也在該回調(diào)函數(shù)中設(shè)置。

如果性能不是很重要,使用D3DPOOL_MANAGED內(nèi)存類型資源永遠(yuǎn)是一種安全的選擇。

第二階段:運(yùn)行

DXUT框架調(diào)用回調(diào)函數(shù)MsgProc()處理各類消息,并在空閑時(shí)間反復(fù)調(diào)用OnFrameMove()OnFrameRender()兩個(gè)函數(shù)進(jìn)行場景渲染。

在每一幀中,程序?yàn)閷?shí)現(xiàn)對場景的刷新,為用戶輸入的響應(yīng)而編寫的代碼通常寫在函數(shù)OnFrameMove()中,例如設(shè)置世界變換矩陣實(shí)現(xiàn)物體的運(yùn)動,它相當(dāng)于“update”的性質(zhì),真正進(jìn)行渲染的代碼寫在函數(shù)OnFrameRender()中。

需要說明的是,在應(yīng)用程序運(yùn)行期間,當(dāng)Direct3D設(shè)備變?yōu)閬G失狀態(tài)時(shí),DXUT框架會調(diào)用OnD3D9LostDevice()函數(shù),釋放所有在回調(diào)函數(shù)OnD3D9ResetDevice()中創(chuàng)建的設(shè)備資源。也就是說,這時(shí)釋放的資源都是D3DPOOL_DEFAULT類型的。當(dāng)Direct3D設(shè)備從丟失狀態(tài)恢復(fù)時(shí),DXUT框架會調(diào)用回調(diào)函數(shù)OnD3D9ResetDevice()重新創(chuàng)建所有類型為D3DPOOL_DEFAULT的資源。也就是說,在程序運(yùn)行時(shí),如果出現(xiàn)設(shè)備丟失現(xiàn)象,OnD3D9LostDevice()OnD3D9ResetDevice()這一對函數(shù)就需要分別調(diào)用一次。

第三階段:退出

在退出程序時(shí),DXUT框架會依次調(diào)用OnD3D9LostDevice()OnD3D9DestroyDevice()回調(diào)函數(shù),在函數(shù)OnD3D9LostDevice()中釋放由函數(shù)OnD3D9ResetDevice()創(chuàng)建的資源,在函數(shù)OnD3D9DestroyDevice()中釋放由函數(shù)OnD3D9CreateDevice()創(chuàng)建的資源。

 

AppFrame.cpp的全部代碼如下:

#include "DXUT.h"
#include 
"resource.h"

//--------------------------------------------------------------------------------------
// Rejects any D3D9 devices that aren't acceptable to the app by returning false.
//--------------------------------------------------------------------------------------
bool CALLBACK IsD3D9DeviceAcceptable(D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, 
                                     
bool bWindowed, void* pUserContext)
{
    
// Typically want to skip back buffer formats that don't support alpha blending

    IDirect3D9
* pD3D = DXUTGetD3D9Object(); 

    
/*
    HRESULT CheckDeviceFormat(
      UINT Adapter,
      D3DDEVTYPE DeviceType,
      D3DFORMAT AdapterFormat,
      DWORD Usage,
      D3DRESOURCETYPE RType,
      D3DFORMAT CheckFormat
    );
    /
*/

    
if(FAILED(pD3D->CheckDeviceFormat(pCaps->AdapterOrdinal, pCaps->DeviceType, AdapterFormat, 
            D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, BackBufferFormat)))
    {
        
return false;
    }

    
return true;
}

//--------------------------------------------------------------------------------------
// Before a device is created, modify the device settings as needed.
//--------------------------------------------------------------------------------------
bool CALLBACK ModifyDeviceSettings(DXUTDeviceSettings* pDeviceSettings, void* pUserContext)
{
    
return true;
}

//--------------------------------------------------------------------------------------
// Create any D3D9 resources that will live through a device reset (D3DPOOL_MANAGED)
// and aren't tied to the back buffer size.
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnD3D9CreateDevice(IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
                                    
void* pUserContext)
{
    
return S_OK;
}

//--------------------------------------------------------------------------------------
// Create any D3D9 resources that won't live through a device reset (D3DPOOL_DEFAULT) 
// or that are tied to the back buffer size.
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnD3D9ResetDevice(IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
                                   
void* pUserContext)
{
    
return S_OK;
}

//--------------------------------------------------------------------------------------
// Handle updates to the scene.  This is called regardless of which D3D API is used.
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove(double fTime, float fElapsedTime, void* pUserContext)
{
}

//--------------------------------------------------------------------------------------
// Render the scene using the D3D9 device
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr;

    
// Clear the render target and the zbuffer 
    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0555), 1.0f0) );

    
// Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
        V( pd3dDevice
->EndScene() );
    }
}


//--------------------------------------------------------------------------------------
// Handle messages to the application 
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 
                          
bool* pbNoFurtherProcessing, void* pUserContext )
{
    
return 0;
}


//--------------------------------------------------------------------------------------
// Release D3D9 resources created in the OnD3D9ResetDevice callback 
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9LostDevice( void* pUserContext )
{
}


//--------------------------------------------------------------------------------------
// Release D3D9 resources created in the OnD3D9CreateDevice callback 
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9DestroyDevice( void* pUserContext )
{
}


//--------------------------------------------------------------------------------------
// Initialize everything and go into a render loop
//--------------------------------------------------------------------------------------
INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
    
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF 
| _CRTDBG_LEAK_CHECK_DF );
#endif

    
// Set the callback functions
    DXUTSetCallbackD3D9DeviceAcceptable(IsD3D9DeviceAcceptable);
    DXUTSetCallbackD3D9DeviceCreated(OnD3D9CreateDevice);
    DXUTSetCallbackD3D9DeviceReset(OnD3D9ResetDevice);
    DXUTSetCallbackD3D9FrameRender(OnD3D9FrameRender);
    DXUTSetCallbackD3D9DeviceLost(OnD3D9LostDevice);
    DXUTSetCallbackD3D9DeviceDestroyed(OnD3D9DestroyDevice);
    DXUTSetCallbackDeviceChanging(ModifyDeviceSettings);
    DXUTSetCallbackMsgProc(MsgProc);
    DXUTSetCallbackFrameMove(OnFrameMove);

    
// TODO: Perform any application-level initialization here

    
// Initialize DXUT and create the desired Win32 window and Direct3D device for the application

    DXUTInit( 
truetrue ); // Parse the command line and show msgboxes
    DXUTSetHotkeyHandling( truetruetrue );  // handle the default hotkeys
    DXUTSetCursorSettings( truetrue ); // Show the cursor and clip it when in full screen
    DXUTCreateWindow( L"AppFrame Sample" );
    DXUTCreateDevice( 
true640480 );

    
// Start the render loop
    DXUTMainLoop();

    
// TODO: Perform any application-level cleanup here

    
return DXUTGetExitCode();
}

運(yùn)行效果圖:




下載示例工程


posted on 2008-05-15 11:23 lovedday 閱讀(3749) 評論(2)  編輯 收藏 引用

評論

# re: DXUT框架剖析(1) 2012-10-14 17:28 小馬甲

博主理解的不錯(cuò) 距離樓主還差的有點(diǎn)遠(yuǎn)  回復(fù)  更多評論   

# re: DXUT框架剖析(1) 2012-10-19 15:30 long275

感謝樓主的講解  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲视频1区| 亚洲专区欧美专区| 久久综合网hezyo| 久久男人资源视频| 久久综合色婷婷| 欧美福利一区二区| 欧美日韩一区二区三区视频| 久久免费视频在线| 欧美激情久久久久久| 欧美日本久久| 国产日韩精品视频一区二区三区| 国产精品三区www17con| 激情成人av在线| 日韩视频―中文字幕| 亚洲专区一区二区三区| 久久精品在线| 亚洲日本成人网| 亚洲每日在线| 欧美主播一区二区三区| 欧美成人在线网站| 国产女精品视频网站免费| 亚洲国产成人91精品| 亚洲免费网址| 亚洲风情在线资源站| 99精品免费| 香蕉精品999视频一区二区| 久久综合九色九九| 亚洲日本成人在线观看| 午夜在线一区| 国产精品v欧美精品v日本精品动漫| 国产视频精品免费播放| 日韩写真在线| 欧美成人一区二区三区| 亚洲免费视频一区二区| 欧美激情按摩在线| 影音先锋中文字幕一区| 午夜精品视频网站| 亚洲精品国产日韩| 久久亚洲欧美国产精品乐播| 国产精品亚洲网站| 亚洲天堂av图片| 亚洲激情小视频| 免费成人高清| 亚洲二区在线| 久久综合久久久久88| 亚洲视频999| 欧美日韩在线播| 亚洲毛片视频| 亚洲国产小视频在线观看| 久久久精彩视频| 国产综合色在线| 久久狠狠亚洲综合| 亚洲欧美在线免费观看| 国产精品久久久久一区| 亚洲一级在线观看| 99热免费精品在线观看| 欧美高清不卡| 99成人免费视频| 亚洲欧洲日本国产| 欧美福利网址| 一本色道综合亚洲| 日韩网站在线| 国产精品豆花视频| 欧美一级电影久久| 性欧美长视频| 国自产拍偷拍福利精品免费一| 久久精品国产99国产精品| 亚洲欧美日韩精品| 韩国一区二区三区在线观看 | 欧美成人dvd在线视频| 欧美在线亚洲| 亚洲精品国产精品国自产在线| 欧美国产日韩xxxxx| 欧美成人精品高清在线播放| 亚洲激情在线观看| 亚洲理伦电影| 国产精品视频自拍| 久久在线视频在线| 欧美黄色成人网| 亚洲一区二区动漫| 香港成人在线视频| 国产日韩一区| 久久婷婷人人澡人人喊人人爽| 性视频1819p久久| 在线观看日韩av先锋影音电影院| 欧美暴力喷水在线| 欧美猛交免费看| 欧美一区二区三区免费观看| 久久精品国产亚洲aⅴ| 又紧又大又爽精品一区二区| 亚洲黄色天堂| 国产亚洲精品美女| 亚洲人体1000| 激情成人中文字幕| 夜夜嗨av色综合久久久综合网| 国产人久久人人人人爽| 亚洲国产成人精品视频| 国产精品一区二区a| 亚洲国产1区| 国产亚洲欧美日韩一区二区| 亚洲国产精品成人久久综合一区| 国产精品欧美在线| 欧美大片在线看| 国产亚洲欧美另类中文| 99re66热这里只有精品4| 国内精品伊人久久久久av一坑| 亚洲六月丁香色婷婷综合久久| 国产在线拍偷自揄拍精品| 亚洲国产日韩精品| 国产在线拍揄自揄视频不卡99| 日韩视频免费大全中文字幕| 在线观看视频欧美| 性欧美xxxx大乳国产app| 亚洲一区日韩在线| 欧美精品一区二区三区很污很色的| 久久久999成人| 国产精品卡一卡二| 亚洲精品一区久久久久久| 一区在线观看| 欧美在线视频一区二区三区| 亚洲免费视频观看| 欧美视频在线免费看| 91久久精品日日躁夜夜躁国产| 永久久久久久| 久久久久久97三级| 久久精品盗摄| 国产亚洲在线观看| 亚洲一区在线直播| 亚洲欧美国产视频| 欧美日韩在线观看一区二区三区| 亚洲国产天堂网精品网站| 在线观看视频一区| 老牛嫩草一区二区三区日本| 久久久久久久久岛国免费| 国产日韩在线亚洲字幕中文| 亚洲一区三区电影在线观看| 亚洲女同精品视频| 国产精品久久久久久久久免费樱桃 | 亚洲二区三区四区| 久久精品99| 欧美不卡视频一区发布| 136国产福利精品导航| 小黄鸭精品密入口导航| 亚洲自拍高清| 国产精品免费电影| 亚洲亚洲精品三区日韩精品在线视频| 日韩一级网站| 欧美视频一区二区在线观看 | 亚洲综合视频网| 国产精品久久久久久久久搜平片 | 亚洲一区日本| 国产午夜精品福利| 久久久久综合网| 亚洲电影在线播放| 亚洲视频导航| 国产日韩欧美一二三区| 久久久久国产一区二区三区四区| 欧美不卡高清| 亚洲一区二区三区精品在线| 国产精品theporn| 亚洲一区区二区| 欧美91福利在线观看| 99精品热视频| 国产婷婷色一区二区三区在线| 久久综合狠狠综合久久综合88 | 日韩视频精品| 久久久蜜桃一区二区人| 亚洲欧洲日韩在线| 国产精品裸体一区二区三区| 久久精品首页| 亚洲精品影院| 久久午夜电影| 亚洲午夜精品| **网站欧美大片在线观看| 欧美婷婷六月丁香综合色| 久久精品视频在线播放| 99热在这里有精品免费| 久久影院亚洲| 亚洲欧美网站| 亚洲国产高清高潮精品美女| 欧美无乱码久久久免费午夜一区| 久久九九全国免费精品观看| 日韩午夜电影| 欧美国产日韩视频| 欧美在线国产| 亚洲婷婷在线| 亚洲精品自在久久| 国产欧美日韩另类视频免费观看| 欧美高清视频| 久久久久在线| 午夜视频在线观看一区二区三区| 亚洲精品男同| 亚洲黄色一区| 欧美黑人一区二区三区| 久久精品在线视频| 欧美一区二区成人6969| 亚洲午夜视频在线观看| 99视频日韩| 亚洲国产福利在线| 亚洲第一偷拍|