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

天行健 君子當自強而不息

DXUT框架剖析(1)

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

 

生成一個Direct3D程序框架

第一步,運行Direct3D示例程序瀏覽器:

 

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

 

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

 

第四步,系統將自動完成工程的創建,然后彈出對話框詢問是否查看創建的工程文件夾中的內容:

若選擇是,則可以查看新創建的工程文件夾的內容:

使用Direct3D程序框架

通過上面的操作,Direct3D已經為我們創建好了一個應用程序框架,該框架主要包括以下文件:

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

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

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 );

函數名前使用"CALLBACK"表示聲明的是一個回調函數,也就是說,這是DXUT框架為我們設置好的接口,DXUT框架將在合適的時機調用相應的回調函數?,F在我們需要做的就是在這些回調函數中填寫相應的代碼完成所需要的功能。為了使DXUT框架能夠調用這些回調函數,還需要在WinMain函數中為DXUT框架設置這些回調函數,代碼如下:

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

 

DXUT框架程序的整個“生命周期”可劃分為三個階段:啟動、運行和結束。

第一階段:啟動

DXUT框架依次執行IsD3D9DeviceAcceptable()、ModifyDeviceSettings()、OnD3D9CreateDevice()、OnD3D9ResetDevice()這4個函數。

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

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

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

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

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

第二階段:運行

DXUT框架調用回調函數MsgProc()處理各類消息,并在空閑時間反復調用OnFrameMove()OnFrameRender()兩個函數進行場景渲染。

在每一幀中,程序為實現對場景的刷新,為用戶輸入的響應而編寫的代碼通常寫在函數OnFrameMove()中,例如設置世界變換矩陣實現物體的運動,它相當于“update”的性質,真正進行渲染的代碼寫在函數OnFrameRender()中。

需要說明的是,在應用程序運行期間,當Direct3D設備變為丟失狀態時,DXUT框架會調用OnD3D9LostDevice()函數,釋放所有在回調函數OnD3D9ResetDevice()中創建的設備資源。也就是說,這時釋放的資源都是D3DPOOL_DEFAULT類型的。當Direct3D設備從丟失狀態恢復時,DXUT框架會調用回調函數OnD3D9ResetDevice()重新創建所有類型為D3DPOOL_DEFAULT的資源。也就是說,在程序運行時,如果出現設備丟失現象,OnD3D9LostDevice()OnD3D9ResetDevice()這一對函數就需要分別調用一次。

第三階段:退出

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

 

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();
}

運行效果圖:




下載示例工程


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

評論

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

博主理解的不錯 距離樓主還差的有點遠  回復  更多評論   

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

感謝樓主的講解  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区欧美视频| 国产精品亚洲第一区在线暖暖韩国| 欧美成人蜜桃| 免费在线观看日韩欧美| 免费在线欧美视频| 亚洲福利一区| 亚洲激情在线激情| 亚洲人精品午夜| 一区二区三区精品视频在线观看| 一本色道久久加勒比88综合| 亚洲欧美日韩在线播放| 久久精品一区四区| 久久久久久久激情视频| 美女精品在线| 国产精品电影观看| 黄色精品免费| 9久草视频在线视频精品| 亚洲欧美另类在线| 免费h精品视频在线播放| 亚洲精品乱码久久久久久黑人| 中文网丁香综合网| 久久久免费观看视频| 欧美日韩国产黄| 韩国女主播一区| 亚洲图片欧美一区| 久久综合狠狠| 亚洲线精品一区二区三区八戒| 久久久免费观看视频| 欧美三级免费| 亚洲精品久久久久久一区二区| 午夜精品美女自拍福到在线| 欧美高清一区二区| 欧美一区二区成人6969| 欧美日韩高清一区| 今天的高清视频免费播放成人 | 亚洲欧美视频一区| 久久久久欧美精品| 亚洲欧洲在线视频| 久久精品欧美日韩| 国产精品国产| 日韩视频不卡| 蜜桃av噜噜一区二区三区| 中文国产成人精品| 欧美久久成人| 亚洲第一色中文字幕| 欧美一区二区三区日韩视频| 91久久香蕉国产日韩欧美9色| 欧美一区亚洲一区| 国产精品香蕉在线观看| 亚洲午夜精品久久| 亚洲精品欧美| 欧美不卡在线视频| 亚洲国产精品黑人久久久| 久久精品国产成人| 午夜精品福利视频| 国产精品一二三四| 午夜精品久久久久久久99黑人| 亚洲精品乱码久久久久久蜜桃91| 老巨人导航500精品| 激情久久五月| 久久一区二区三区av| 性高湖久久久久久久久| 国产精品区一区二区三区| 亚洲综合三区| 一区二区三区四区蜜桃| 欧美日韩国产在线播放网站| 亚洲破处大片| 91久久精品网| 欧美日韩裸体免费视频| 亚洲在线免费观看| 亚洲一区二区三区四区中文| 国产精品白丝jk黑袜喷水| 午夜精品一区二区三区在线播放 | 欧美影院在线| 午夜电影亚洲| 国产综合久久| 欧美 日韩 国产一区二区在线视频| 久久黄色级2电影| 在线播放日韩欧美| 亚洲国内在线| 欧美色网一区二区| 久久成人精品| 久久男人资源视频| 亚洲免费观看视频| 亚洲视频在线一区| 国内精品久久久久久 | 篠田优中文在线播放第一区| 亚洲欧美日韩成人高清在线一区| 国产亚洲毛片在线| 欧美成人黄色小视频| 欧美破处大片在线视频| 欧美大片在线看免费观看| 国产精品国产三级国产aⅴ入口 | 亚洲欧美日韩天堂| 国产伦理一区| 伊人成人开心激情综合网| 蜜臀a∨国产成人精品| 欧美成在线观看| 中国女人久久久| 久久国产加勒比精品无码| 亚洲人成在线观看| 午夜久久久久| 亚洲精品视频免费观看| 亚洲一区二区三区久久 | 欧美专区日韩专区| 亚洲免费不卡| 欧美一区二区在线观看| 99国产精品视频免费观看| 亚洲影院免费| 日韩一二三区视频| 欧美在线电影| 亚洲免费网址| 欧美大片在线观看| 久久免费视频在线观看| 欧美日韩爆操| 亚洲国产精品第一区二区| 亚洲欧洲在线一区| 欧美一级片在线播放| 亚洲一区免费在线观看| 亚洲精品久久久久| 国产一区二区三区在线观看免费视频| 欧美电影免费观看高清| 国产精品每日更新在线播放网址| 久久亚洲私人国产精品va| 国产精品vvv| 亚洲国产一区二区在线| 狠狠色伊人亚洲综合成人| 亚洲综合国产精品| 亚洲欧美国产日韩天堂区| 欧美剧在线免费观看网站| 久久亚洲影院| 一区在线播放视频| 欧美制服丝袜| 老司机成人在线视频| 国产视频一区欧美| 久久se精品一区二区| 久久久国产一区二区| 国内揄拍国内精品久久| 欧美在线一二三区| 久久久综合香蕉尹人综合网| 国内免费精品永久在线视频| 欧美在线短视频| 老牛影视一区二区三区| 亚洲第一精品电影| 欧美激情精品久久久| 亚洲三级影片| 亚洲永久免费精品| 国产精品午夜在线| 欧美一区日韩一区| 美女999久久久精品视频| 欧美一二三区在线观看| 国产欧美视频在线观看| 欧美亚洲综合另类| 久久天天躁狠狠躁夜夜爽蜜月| 禁久久精品乱码| 麻豆精品网站| 亚洲免费久久| 午夜精彩视频在线观看不卡| 国产亚洲成av人在线观看导航| 午夜天堂精品久久久久| 久久久久久成人| 亚洲黄色成人久久久| 欧美日韩国产探花| 一区二区三区你懂的| 久久成人av少妇免费| 影视先锋久久| 欧美日韩免费观看一区=区三区| 在线天堂一区av电影| 久久国产精品久久久久久久久久 | 亚洲黄色av| 亚洲影院在线| 在线日本高清免费不卡| 欧美精品色综合| 欧美在线3区| 99精品99| 久久午夜影视| 亚洲免费在线观看| 在线免费高清一区二区三区| 欧美噜噜久久久xxx| 欧美一区久久| 亚洲视频狠狠| 亚洲国产精品va| 久久国产手机看片| 亚洲作爱视频| 在线观看精品视频| 国产日韩免费| 欧美视频在线观看一区二区| 久久亚洲图片| 午夜电影亚洲| 亚洲午夜av在线| 亚洲激情一区| 欧美丰满少妇xxxbbb| 久久精品国产91精品亚洲| 一区二区三区国产精品| 在线观看精品视频| 狠狠色综合一区二区| 国产精品影片在线观看| 欧美视频专区一二在线观看| 美女主播一区| 久久综合国产精品台湾中文娱乐网|