• <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>

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

            DXUT框架剖析(1)

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

             

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

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

             

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

             

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

             

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

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

            使用Direct3D程序框架

            通過(guò)上面的操作,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ù),也就是說(shuō),這是DXUT框架為我們?cè)O(shè)置好的接口,DXUT框架將在合適的時(shí)機(jī)調(diào)用相應(yīng)的回調(diào)函數(shù)。現(xiàn)在我們需要做的就是在這些回調(diào)函數(shù)中填寫(xiě)相應(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è)階段:?jiǎn)?dòng)、運(yùn)行和結(jié)束。

            第一階段:?jiǎn)?dòng)

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

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

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

            DXUT框架創(chuàng)建了Direct3D設(shè)備之后,接下來(lái)會(huì)調(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)存,不會(huì)出現(xiàn)設(shè)備丟失的現(xiàn)象。也就是說(shuō),以這兩種內(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í)會(huì)出現(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)行場(chǎng)景渲染。

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

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

            第三階段:退出

            在退出程序時(shí),DXUT框架會(huì)依次調(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 閱讀(3747) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

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

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

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

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


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


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            91久久精品国产91性色也| 久久亚洲国产成人影院网站| 三级三级久久三级久久 | 人妻无码αv中文字幕久久琪琪布| 久久99久久99精品免视看动漫 | 情人伊人久久综合亚洲| 99久久精品免费国产大片| 欧美日韩中文字幕久久久不卡| 久久久无码精品亚洲日韩蜜臀浪潮| 欧洲人妻丰满av无码久久不卡| 色综合久久中文色婷婷| 久久精品国产色蜜蜜麻豆| 一本伊大人香蕉久久网手机| 偷窥少妇久久久久久久久| 91精品国产色综久久| 亚洲日本va中文字幕久久| 精品久久人人爽天天玩人人妻| 欧美伊人久久大香线蕉综合| 久久免费精品一区二区| 精品无码久久久久国产动漫3d| 国产精品成人99久久久久| 久久九九精品99国产精品| 蜜桃麻豆www久久国产精品| 777久久精品一区二区三区无码| 亚洲中文久久精品无码ww16 | 无码人妻少妇久久中文字幕蜜桃 | 国产午夜精品理论片久久| 伊人久久大香线蕉av不变影院| 久久性精品| 国产三级观看久久| 91麻精品国产91久久久久| 99久久国产综合精品麻豆| 久久国产精品99精品国产| 漂亮人妻被黑人久久精品| 久久婷婷五月综合97色| 无码人妻久久一区二区三区| 日韩av无码久久精品免费| 日韩精品久久久久久免费| 久久精品国产亚洲77777| 99国产欧美精品久久久蜜芽| 99999久久久久久亚洲|