DXUT工作模式的簡單解析_第1頁
DXUT工作模式的簡單解析_第2頁
DXUT工作模式的簡單解析_第3頁
DXUT工作模式的簡單解析_第4頁
DXUT工作模式的簡單解析_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論