




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
DXUT工作模式的簡單解析這里要討論的是,DXUT中的一般框架。以前看了很多資料了,講得十分詳細(xì)。不過我在這里就把一些簡單的東西總結(jié)一下,比如DXUT的工作機制以及模式。對只想了解一下并且快速上手使用的人應(yīng)該很有幫助。下面要說的只是我自己自學(xué)以及領(lǐng)悟到的內(nèi)容而已,難免有疏漏和錯誤,希望讀者可以幫我指出。 DXUT,就是DirectXSDK中附帶的一個功能齊全的Direct3D底層框架,有各種語言版本,但其實構(gòu)架都差不多。這里以C++的為標(biāo)準(zhǔn),SDK版本為June2008。 先把DirectXSDK里的EmptyProject安裝了,打開工程。 簡單了解的話,只用來看一下這個DXUT.h,我再稍微說一下就應(yīng)該大概明白了。不要被代碼嚇?。。?!往后看吧。這個代碼是拿來對照講的。1// 2//File:DXUT.h4//Copyright(c)MicrosoftCorporation.Allrightsreserved.5// 6#pragmaonce7#ifndefDXUT_H8#defineDXUT_H910#ifndefUNICODE11#error"DXUTrequiresaUnicodebuild.Seethenearbycommentsfordetails"12//13//IfyouareusingMicrosoftVisualC++.NET,undertheGeneraltaboftheproject14//propertieschangetheCharacterSetto'UseUnicodeCharacterSet'.15//16//WindowsXPandlaterarenativeUnicodesoUnicodeapplicationswillperformbetter.17//ForWindows98andWindowsMesupport,considerusingtheMicrosoftLayerforUnicode(MSLU).18//19//TouseMSLU,linkagainstasetoflibrariessimilartothis20///nod:kernel32.lib/nod:advapi32.lib/nod:user32.lib/nod:gdi32.lib/nod:shell32.lib/nod:comdlg32.lib/nod:version.lib/nod:mpr.lib/nod:rasapi32.lib/nod:winmm.lib/nod:winspool.lib/nod:vfw32.lib/nod:secur32.lib/nod:oleacc.lib/nod:oledlg.lib/nod:sensapi.libUnicoWS.libkernel32.libadvapi32.libuser32.libgdi32.libshell32.libcomdlg32.libversion.libmpr.librasapi32.libwinmm.libwinspool.libvfw32.libsecur32.liboleacc.liboledlg.libsensapi.libdxerr.libdxguid.libd3dx9d.libd3d9.libcomctl32.libdsound.lib21//andputtheunicows.dll(availablefordownloadfrom)intheexe'sfolder.22//23//FormoredetailsseetheMSDNarticletitled:24//"MSLU:DevelopUnicodeApplicationsforWindows9xPlatformswiththeMicrosoftLayerforUnicode"25//at/msdnmag/issues/01/10/MSLU/default.aspx26//27#endif2829// 30//Structs31// 32classCD3DEnumeration;3334structDXUTDeviceSettings35(UINTAdapterOrdinal;D3DDEVTYPEDeviceType;D3DFORMATAdapterFormat;DWORDBehaviorFlags;D3DPRESENT_PARAMETERSpp;41};4244// 45//Errorcodes46// 47#defineDXUTERR_NODIRECT3DMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0901)48#defineDXUTERR_NOCOMPATIBLEDEVICESMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0902)49#defineDXUTERR_MEDIANOTFOUNDMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0903)50#defineDXUTERR_NONZEROREFCOUNTMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0904)51#defineDXUTERR_CREATINGDEVICEMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0905)52#defineDXUTERR_RESETTINGDEVICEMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0906)53#defineDXUTERR_CREATINGDEVICEOBJECTSMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0907)54#defineDXUTERR_RESETTINGDEVICEOBJECTSMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0908)55#defineDXUTERR_INCORRECTVERSIONMAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x0909)565758// 59//Callbackregistration61typedefbool(CALLBACK*LPDXUTCALLBACKISDEVICEACCEPTABLE)(D3DCAPS9*pCaps,D3DFORMATAdapterFormat,D3DFORMATBackBufferFormat,boolbWindowed,void*pUserContext);62typedefbool(CALLBACK*LPDXUTCALLBACKMODIFYDEVICESETTINGS)(DXUTDeviceSettings*pDeviceSettings,constD3DCAPS9*pCaps,void*pUserContext);63typedefHRESULT(CALLBACK*LPDXUTCALLBACKDEVICECREATED)(IDirect3DDevice9*pd3dDevice,constD3DSURFACE_DESC*pBackBufferSurfaceDesc,void*pUserContext);64typedefHRESULT(CALLBACK*LPDXUTCALLBACKDEVICERESET)(IDirect3DDevice9*pd3dDevice,constD3DSURFACE_DESC*pBackBufferSurfaceDesc,void*pUserContext);65typedefvoid(CALLBACK*LPDXUTCALLBACKDEVICEDESTROYED)(void*pUserContext);66typedefvoid(CALLBACK*LPDXUTCALLBACKDEVICELOST)(void*pUserContext);67typedefvoid(CALLBACK*LPDXUTCALLBACKFRAMEMOVE)(IDirect3DDevice9*pd3dDevice,doublefTime,floatfElapsedTime,void*pUserContext);68typedefvoid(CALLBACK*LPDXUTCALLBACKFRAMERENDER)(IDirect3DDevice9*pd3dDevice,doublefTime,floatfElapsedTime,void*pUserContext);69typedefvoid(CALLBACK*LPDXUTCALLBACKKEYBOARD)(UINTnChar,boolbKeyDown,boolbAltDown,void*pUserContext);70typedefvoid(CALLBACK*LPDXUTCALLBACKMOUSE)(boolbLeftButtonDown,boolbRightButtonDown,boolbMiddleButtonDown,boolbSideButton1Down,boolbSideButton2Down,intnMouseWheelDelta,intxPos,intyPos,void*pUserContext);71typedefLRESULT(CALLBACK*LPDXUTCALLBACKMSGPROC)(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam,bool*pbNoFurtherProcessing,void*pUserContext);72typedefvoid(CALLBACK*LPDXUTCALLBACKTIMER)(UINTidEvent,void*pUserContext);7374//Devicecallbacks75voidDXUTSetCallbackDeviceCreated(LPDXUTCALLBACKDEVICECREATEDpCallbackDeviceCreated,void*pUserContext=NULL);76voidDXUTSetCallbackDeviceReset(LPDXUTCALLBACKDEVICERESETpCallbackDeviceReset,void*pUserContext=NULL);77voidDXUTSetCallbackDeviceLost(LPDXUTCALLBACKDEVICELOSTpCallbackDeviceLost,void*pUserContext=NULL);78voidDXUTSetCallbackDeviceDestroyed(LPDXUTCALLBACKDEVICEDESTROYEDpCallbackDeviceDestroyed,void*pUserContext=NULL);79voidDXUTSetCallbackDeviceChanging(LPDXUTCALLBACKMODIFYDEVICESETTINGSpCallbackModifyDeviceSettings,void*pUserContext=NULL);8081//Framecallbacks82voidDXUTSetCallbackFrameMove(LPDXUTCALLBACKFRAMEMOVEpCallbackFrameMove,void*pUserContext=NULL);83voidDXUTSetCallbackFrameRender(LPDXUTCALLBACKFRAMERENDERpCallbackFrameRender,void*pUserContext=NULL);8485//Messagecallbacks86voidDXUTSetCallbackKeyboard(LPDXUTCALLBACKKEYBOARDpCallbackKeyboard,void*pUserContext=NULL);87voidDXUTSetCallbackMouse(LPDXUTCALLBACKMOUSEpCallbackMouse,boolbIncludeMouseMove=false,void*pUserContext=NULL);88voidDXUTSetCallbackMsgProc(LPDXUTCALLBACKMSGPROCpCallbackMsgProc,void*pUserContext=NULL);899091// 92//Initialization93// 94HRESULTDXUTInit(boolbParseCommandLine=true,boolbHandleDefaultHotkeys=true,boolbShowMsgBoxOnError=true,boolbHandleAltEnter=true);9596//ChooseeitherDXUTCreateWindoworDXUTSetWindow.IfusingDXUTSetWindow,considerusingDXUTStaticWndProc97HRESULTDXUTCreateWindow(constWCHAR*strWindowTitle=L"Direct3DWindow",98HINSTANCEhInstance=98NULL,HICONhIcon=NULL,HMENUhMenu=NULL,99 intx=CW_USEDEFAULT,inty=CW_USEDEFAULT);100HRESULTDXUTSetWindow(HWNDhWndFocus,HWNDhWndDeviceFullScreen,HWNDhWndDeviceWindowed,boolbHandleMessages=true);101LRESULTCALLBACKDXUTStaticWndProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);102103//ChooseeitherDXUTCreateDeviceorDXUTSetDeviceorDXUTCreateDeviceFromSettings104HRESULTDXUTCreateDevice(UINTAdapterOrdinal=D3DADAPTER_DEFAULT,boolbWindowed=true,105 intnSuggestedWidth=0,intnSuggestedHeight=0,106LPDXUTCALLBACKISDEVICEACCEPTABLEpCallbackIsDeviceAcceptable=NULL,107LPDXUTCALLBACKMODIFYDEVICESETTINGSpCallbackModifyDeviceSettings=NULL,108 void*pUserContext=NULL);109HRESULTDXUTCreateDeviceFromSettings(DXUTDeviceSettings*pDeviceSettings,boolbPreserveInput=false,boolbClipWindowToSingleAdapter=true);110HRESULTDXUTSetDevice(IDirect3DDevice9*pd3dDevice);111112//ChooseeitherDXUTMainLooporimplementyourownmainloop113HRESULTDXUTMainLoop(HACCELhAccel=NULL);114115//IfnotusingDXUTMainLoopconsiderusingDXUTRender3DEnvironment116voidDXUTRender3DEnvironment();117118120//Findingvaliddevicesettings121// 122enumDXUT_MATCH_TYPE123(DXUTMT_IGNORE_INPUT=0,//UsetheclosestvalidvaluetoadefaultDXUTMT_PRESERVE_INPUT,//Useinputwithoutchange,butmaycausenovaliddevicetobefoundDXUTMT_CLOSEST_TO_INPUT//Usetheclosestvalidvaluetotheinput127};128129structDXUTMatchOptions130(DXUT_MATCH_TYPEeAdapterOrdinal;DXUT_MATCH_TYPEeDeviceType;DXUT_MATCH_TYPEeWindowed;DXUT_MATCH_TYPEeAdapterFormat;DXUT_MATCH_TYPEeVertexProcessing;DXUT_MATCH_TYPEeResolution;DXUT_MATCH_TYPEeBackBufferFormat;DXUT_MATCH_TYPEeBackBufferCount;DXUT_MATCH_TYPEeMultiSample;DXUT_MATCH_TYPEeSwapEffect;DXUT_MATCH_TYPEeDepthFormat;DXUT_MATCH_TYPEeStencilFormat;DXUT_MATCH_TYPEePresentFlags;DXUT_MATCH_TYPEeRefreshRate;DXUT_MATCH_TYPEePresentInterval;146};147148HRESULTDXUTFindValidDeviceSettings(DXUTDeviceSettings*pOut,DXUTDeviceSettings*pIn=NULL,DXUTMatchOptions*pMatchOptions=NULL);149150151// 152//CommonTasks153// 154voidDXUTSetCursorSettings(boolbShowCursorWhenFullScreen,boolbClipCursorWhenFullScreen);155voidDXUTSetMultimonSettings(boolbAutoChangeAdapter);156voidDXUTSetShortcutKeySettings(boolbAllowWhenFullscreen=false,boolbAllowWhenWindowed=true);//ControlstheWindowskey,andaccessibilityshortcutkeys157voidDXUTSetWindowSettings(boolbCallDefWindowProc=true);158voidDXUTSetConstantFrameTime(boolbConstantFrameTime,floatfTimePerFrame=0.0163f);159HRESULTDXUTSetTimer(LPDXUTCALLBACKTIMERpCallbackTimer,floatfTimeoutInSecs=1.0f,UINT*pnIDEvent=NULL,void*pCallbackUserContext=NULL);160HRESULTDXUTKillTimer(UINTnIDEvent);161HRESULTDXUTToggleFullScreen();162HRESULTDXUTToggleREF();163voidDXUTPause(boolbPauseTime,boolbPauseRendering);164voidDXUTResetFrameworkState();165voidDXUTShutdown(intnExitCode=0);166167168// 169//StateRetrieval170// 171IDirect3D9* DXUTGetD3DObject();//DoesnotaddrefunliketypicalGet*APIs172IDirect3DDevice9* DXUTGetD3DDevice();//DoesnotaddrefunliketypicalGet*APIs173DXUTDeviceSettingsDXUTGetDeviceSettings();174D3DPRESENT_PARAMETERSDXUTGetPresentParameters();175constD3DSURFACE_DESC*DXUTGetBackBufferSurfaceDesc();176constD3DCAPS9* DXUTGetDeviceCaps();177HINSTANCEDXUTGetHINSTANCE();178HWND DXUTGetHWND();
179HWNDDXUTGetHWNDFocus();179HWNDDXUTGetHWNDFocus();180HWNDDXUTGetHWNDDeviceFullScreen();181HWNDDXUTGetHWNDDeviceWindowed();182RECTDXUTGetWindowClientRect();183RECTDXUTGetWindowClientRectAtModeChange();//Usefulforreturningtowindowedmodewiththesameresolutionasbeforetoggletofullscreenmode184RECTDXUTGetFullsceenClientRectAtModeChange();//Usefulforreturningtofullscreenmodewiththesameresolutionasbeforetoggletowindowedmode185doubleDXUTGetTime();186floatDXUTGetElapsedTime();187boolDXUTIsWindowed();188floatDXUTGetFPS();189LPCWSTRDXUTGetWindowTitle();190LPCWSTRDXUTGetFrameStats(boolbIncludeFPS=false);
191LPCWSTRDXUTGetDeviceStats();191LPCWSTRDXUTGetDeviceStats();192boolDXUTIsRenderingPaused();193bool DXUTIsTimePaused();194bool DXUTIsActive();195int DXUTGetExitCode();196boolDXUTGetShowMsgBoxOnError();197boolDXUTGetHandleDefaultHotkeys();198bool DXUTIsKeyDown(BYTEvKey);//Passavirtual-keycode,ex.VK_F1,'A',VK_RETURN,VK_LSHIFT,etc199boolDXUTIsMouseButtonDown(BYTEvButton);//Passavirtual-keycode:VK_LBUTTON,VK_RBUTTON,VK_MBUTTON,VK_XBUTTON1,VK_XBUTTON2200bool DXUTGetAutomation();//Returnstrueif-automationparameterisusedtolaunchtheapp201202#endif204205206207千萬別被代碼嚇住。對于不需要深入理解的我們來說,大多數(shù)都是不需要關(guān)心的。如果您需要深入理解的話,我非常抱歉我?guī)筒簧厦?。在CPPBLOG里面有個標(biāo)題為“天行健君子當(dāng)自強不息”的一個BLOG里面有專門詳細(xì)解析DXUT的文章。鏈接請自己百度一下吧。于是我們來關(guān)注一下這個優(yōu)美的框架。它定義了很多回調(diào)函數(shù),以及留了許多接口。我們需要關(guān)心的是這幾個:DXUTSetCallbackDeviceCreated為框架掛接上Direct3D設(shè)備創(chuàng)建后的回調(diào)函數(shù)DXUTSetCallbackDeviceReset掛接Direct3D設(shè)備重置后的回調(diào)函數(shù)DXUTSetCallbackDeviceLost掛接Direct3D設(shè)備丟失后的回調(diào)函數(shù)DXUTSetCallbackDeviceDestroyed掛接Direct3D設(shè)備銷毀后的回調(diào)函數(shù)DXUTSetCallbackFrameRender掛接每幀渲染場景時的回調(diào)函數(shù)DXUTSetCallbackFrameMove掛接每幀渲染前需要更新場景時的回調(diào)函數(shù)DXUTSetCallbackMouse掛接鼠標(biāo)事件的回調(diào)函數(shù)DXUTSetCallbackKeyboard掛接鍵盤事件的回調(diào)函數(shù)于是我們打開EmptyProject.cpp看著WinMain函數(shù)1// 2//Initializeeverythingandgointoarenderloop3// 4INTWINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int)5(67 //設(shè)置回調(diào)函數(shù)DXUTSetCallbackDeviceCreated(OnCreateDevice);9DXUTSetCallbackDeviceReset(OnResetDevice);10DXUTSetCallbackDeviceLost(OnLostDevice);11DXUTSetCallbackDeviceDestroyed(OnDestroyDevice);12DXUTSetCallbackMsgProc(MsgProc);13DXUTSetCallbackFrameRender(OnFrameRender);DXUTSetCallbackFrameMove(OnFrameMove);DXUTSetCallbackMouse(OnMouseEvent,true);//第二個參數(shù)是指是否包含鼠標(biāo)移動事件DXUTSetCallbackKeyboard(OnKeyEvent);1718 //這里寫在程序底層初始化前需要的代碼1920//初始化DXUT、程序窗口、Direct3D設(shè)備DXUTInit(true,false,true);//Parsethecommandline,handlethedefaulthotkeys,andshowmsgboxesDXUTSetCursorSettings(true,true);//ShowthecursorandclipitwheninfullscreenDXUTCreateWindow("EmptyProject”);//窗口標(biāo)題DXUTCreateDevice(D3DADAPTER_DEFAULT,true,640,480,IsDeviceAcceptable,ModifyDeviceSettings);〃創(chuàng)建設(shè)備//開始DXUT主循環(huán)DXUTMainLoop();28//這里寫清理底層的代碼returnDXUTGetExitCode();31}看見了么,在這里掛接了需要的回調(diào)函數(shù),不如我們將他們叫做“事件”,這樣更好理解。自己看一下就能明白那些代碼的意思了OnCreateDeviceOnResetDeviceOnLostDeviceOnDestroyDeviceMSgProcOnFrameRenderOnFrameMoveOnMouseEventOnKetEvent這些都是已經(jīng)定義好的CALLBACK,我們的框架將從DXUTMainLoop()這里開始簡單來說,我們需要了解的就只有這些事件的觸發(fā)順序了。HRESULTCALLBACKOnCreateDevice(Device*pd3dDevice,constD3DSURFACE_DESC*pBackBufferSurfaceDesc,void*pUserContext)這個事件在設(shè)備創(chuàng)建完畢時就會觸發(fā),最先觸發(fā)的東西。第一個參數(shù)是創(chuàng)建后的設(shè)備,第二個是設(shè)備的表面參數(shù)。pUserContext不需要關(guān)心,因此不討論。下同。HRESULTCALLBACKOnResetDevice(Device*pd3dDevice,constD3DSURFACE_DESC*pBackBufferSurfaceDesc,void*pUserContext)這個事件在設(shè)備重置的時候會觸發(fā)。那么什么叫做設(shè)備重置呢?等下會和設(shè)備丟失一起說。第一個參數(shù)是重置后的設(shè)備,第二個是重置后設(shè)備的表面參數(shù)。voidCALLBACKOnLostDevice(void*pUserContext)這個事件在設(shè)備丟失的時候會觸發(fā)。舉個簡單的例子,把窗口最小化的時候設(shè)備會丟失,而恢復(fù)的時候設(shè)備會重置。從全屏換為窗口的時候也會丟失并且重置。大概就是改變窗口的大小、位置、是否全屏的時候,會導(dǎo)致設(shè)備丟失,隨后恢復(fù)的時候會重置。這兩個事件的觸發(fā)就是為了在窗口改變的時候重新設(shè)置一些參數(shù),讓畫面適應(yīng)當(dāng)前窗口設(shè)置。voidCALLBACKOnFrameMove(Device*pd3dDevice,doublefT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)院食材采購 投標(biāo)方案(技術(shù)方案)
- 電商平臺具體業(yè)務(wù)
- 中醫(yī)護(hù)理學(xué)(第5版)課件 第一節(jié) 中藥方劑基本常識
- 電子商務(wù)安全交易規(guī)范手冊
- 公路建設(shè)項目工程可行性研究報告編制辦法
- 系統(tǒng)可行性分析包括哪些內(nèi)容
- 農(nóng)產(chǎn)品加工與綜合利用技術(shù)手冊
- 品牌建設(shè)與營銷策略實施方案
- 可行性研究報告審核
- 三農(nóng)種植技術(shù)操作手冊
- GB/T 15819-2006灌溉用聚乙烯(PE)管材由插入式管件引起環(huán)境應(yīng)力開裂敏感性的試驗方法和技術(shù)要求
- GB/T 12996-2012電動輪椅車
- 變壓器的維護(hù)及檢修技能培訓(xùn)課件
- 大雁考上郵遞員新課件
- 《材料分析測試技術(shù)》全套教學(xué)課件
- 消防水池 (有限空間)作業(yè)安全告知牌及警示標(biāo)志
- 船舶保險投標(biāo)文件模板
- (完整版)形式發(fā)票模版(國際件通用)
- 施工二次結(jié)構(gòu)模板技術(shù)交底(一)
- 報關(guān)實務(wù)完整版課件全套ppt最全電子教案整書教案教學(xué)設(shè)計教學(xué)教程
- GM∕T 0036-2014 采用非接觸卡的門禁系統(tǒng)密碼應(yīng)用指南
評論
0/150
提交評論