這里要討論的是,DXUT中的一般框架。以前看了很多資料了,講得十分詳細(xì)。不過我在這里就把一些簡單的東西總結(jié)一下,比如DXUT的工作機(jī)制以及模式。對只想了解一下并且快速上手使用的人應(yīng)該很有幫助。
      下面要說的只是我自己自學(xué)以及領(lǐng)悟到的內(nèi)容而已,難免有疏漏和錯(cuò)誤,希望讀者可以幫我指出。

      DXUT,就是DirectX SDK中附帶的一個(gè)功能齊全的Direct3D底層框架,有各種語言版本,但其實(shí)構(gòu)架都差不多。這里以C++的為標(biāo)準(zhǔn),SDK版本為June 2008。

      先把DirectX SDK里的EmptyProject安裝了,打開工程。

      簡單了解的話,只用來看一下這個(gè)DXUT.h,我再稍微說一下就應(yīng)該大概明白了。
      不要被代碼嚇住!!!往后看吧。這個(gè)代碼是拿來對照講的。
   

  1//--------------------------------------------------------------------------------------
  2// File: DXUT.h
  3//
  4// Copyright (c) Microsoft Corporation. All rights reserved.
  5//--------------------------------------------------------------------------------------
  6#pragma once
  7#ifndef DXUT_H
  8#define DXUT_H
  9
 10#ifndef UNICODE
 11#error "DXUT requires a Unicode build. See the nearby comments for details"
 12//
 13// If you are using Microsoft Visual C++ .NET, under the General tab of the project 
 14// properties change the Character Set to 'Use Unicode Character Set'.  
 15//
 16// Windows XP and later are native Unicode so Unicode applications will perform better.  
 17// For Windows 98 and Windows Me support, consider using the Microsoft Layer for Unicode (MSLU).  
 18//
 19// To use MSLU, link against a set of libraries similar to this
 20//      /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.lib UnicoWS.lib kernel32.lib advapi32.lib user32.lib gdi32.lib shell32.lib comdlg32.lib version.lib mpr.lib rasapi32.lib winmm.lib winspool.lib vfw32.lib secur32.lib oleacc.lib oledlg.lib sensapi.lib dxerr.lib dxguid.lib d3dx9d.lib d3d9.lib comctl32.lib dsound.lib
 21// and put the unicows.dll (available for download from msdn.microsoft.com) in the exe's folder.
 22// 
 23// For more details see the MSDN article titled:
 24// "MSLU: Develop Unicode Applications for Windows 9x Platforms with the Microsoft Layer for Unicode"
 25// at http://msdn.microsoft.com/msdnmag/issues/01/10/MSLU/default.aspx 
 26//
 27#endif
 28
 29//--------------------------------------------------------------------------------------
 30// Structs
 31//--------------------------------------------------------------------------------------
 32class CD3DEnumeration;
 33
 34struct DXUTDeviceSettings
 35{
 36    UINT AdapterOrdinal;
 37    D3DDEVTYPE DeviceType;
 38    D3DFORMAT AdapterFormat;
 39    DWORD BehaviorFlags;
 40    D3DPRESENT_PARAMETERS pp;
 41}
;
 42
 43
 44//--------------------------------------------------------------------------------------
 45// Error codes
 46//--------------------------------------------------------------------------------------
 47#define DXUTERR_NODIRECT3D              MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0901)
 48#define DXUTERR_NOCOMPATIBLEDEVICES     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0902)
 49#define DXUTERR_MEDIANOTFOUND           MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0903)
 50#define DXUTERR_NONZEROREFCOUNT         MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0904)
 51#define DXUTERR_CREATINGDEVICE          MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0905)
 52#define DXUTERR_RESETTINGDEVICE         MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0906)
 53#define DXUTERR_CREATINGDEVICEOBJECTS   MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0907)
 54#define DXUTERR_RESETTINGDEVICEOBJECTS  MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0908)
 55#define DXUTERR_INCORRECTVERSION        MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0909)
 56
 57
 58//--------------------------------------------------------------------------------------
 59// Callback registration 
 60//--------------------------------------------------------------------------------------
 61typedef bool    (CALLBACK *LPDXUTCALLBACKISDEVICEACCEPTABLE)( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext );
 62typedef bool    (CALLBACK *LPDXUTCALLBACKMODIFYDEVICESETTINGS)( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext );
 63typedef HRESULT (CALLBACK *LPDXUTCALLBACKDEVICECREATED)( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
 64typedef HRESULT (CALLBACK *LPDXUTCALLBACKDEVICERESET)( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
 65typedef void    (CALLBACK *LPDXUTCALLBACKDEVICEDESTROYED)( void* pUserContext );
 66typedef void    (CALLBACK *LPDXUTCALLBACKDEVICELOST)( void* pUserContext );
 67typedef void    (CALLBACK *LPDXUTCALLBACKFRAMEMOVE)( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
 68typedef void    (CALLBACK *LPDXUTCALLBACKFRAMERENDER)( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
 69typedef void    (CALLBACK *LPDXUTCALLBACKKEYBOARD)( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext );
 70typedef void    (CALLBACK *LPDXUTCALLBACKMOUSE)( bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown, bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta, int xPos, int yPos, void* pUserContext );
 71typedef LRESULT (CALLBACK *LPDXUTCALLBACKMSGPROC)( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext );
 72typedef void    (CALLBACK *LPDXUTCALLBACKTIMER)( UINT idEvent, void* pUserContext );
 73
 74// Device callbacks
 75void DXUTSetCallbackDeviceCreated( LPDXUTCALLBACKDEVICECREATED pCallbackDeviceCreated, void* pUserContext = NULL );
 76void DXUTSetCallbackDeviceReset( LPDXUTCALLBACKDEVICERESET pCallbackDeviceReset, void* pUserContext = NULL );
 77void DXUTSetCallbackDeviceLost( LPDXUTCALLBACKDEVICELOST pCallbackDeviceLost, void* pUserContext = NULL );
 78void DXUTSetCallbackDeviceDestroyed( LPDXUTCALLBACKDEVICEDESTROYED pCallbackDeviceDestroyed, void* pUserContext = NULL );
 79void DXUTSetCallbackDeviceChanging( LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallbackModifyDeviceSettings, void* pUserContext = NULL );
 80
 81// Frame callbacks
 82void DXUTSetCallbackFrameMove( LPDXUTCALLBACKFRAMEMOVE pCallbackFrameMove, void* pUserContext = NULL );
 83void DXUTSetCallbackFrameRender( LPDXUTCALLBACKFRAMERENDER pCallbackFrameRender, void* pUserContext = NULL );
 84
 85// Message callbacks
 86void DXUTSetCallbackKeyboard( LPDXUTCALLBACKKEYBOARD pCallbackKeyboard, void* pUserContext = NULL );
 87void DXUTSetCallbackMouse( LPDXUTCALLBACKMOUSE pCallbackMouse, bool bIncludeMouseMove = falsevoid* pUserContext = NULL );
 88void DXUTSetCallbackMsgProc( LPDXUTCALLBACKMSGPROC pCallbackMsgProc, void* pUserContext = NULL );
 89
 90
 91//--------------------------------------------------------------------------------------
 92// Initialization
 93//--------------------------------------------------------------------------------------
 94HRESULT DXUTInit( bool bParseCommandLine = truebool bHandleDefaultHotkeys = truebool bShowMsgBoxOnError = truebool bHandleAltEnter = true );
 95
 96// Choose either DXUTCreateWindow or DXUTSetWindow.  If using DXUTSetWindow, consider using DXUTStaticWndProc
 97HRESULT DXUTCreateWindow( const WCHAR* strWindowTitle = L"Direct3D Window"
 98                          HINSTANCE hInstance = NULL, HICON hIcon = NULL, HMENU hMenu = NULL,
 99                          int x = CW_USEDEFAULT, int y = CW_USEDEFAULT );
100HRESULT DXUTSetWindow( HWND hWndFocus, HWND hWndDeviceFullScreen, HWND hWndDeviceWindowed, bool bHandleMessages = true );
101LRESULT CALLBACK DXUTStaticWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
102
103// Choose either DXUTCreateDevice or DXUTSetDevice or DXUTCreateDeviceFromSettings
104HRESULT DXUTCreateDevice( UINT AdapterOrdinal = D3DADAPTER_DEFAULT, bool bWindowed = true
105                          int nSuggestedWidth = 0int nSuggestedHeight = 0,
106                          LPDXUTCALLBACKISDEVICEACCEPTABLE pCallbackIsDeviceAcceptable = NULL,
107                          LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallbackModifyDeviceSettings = NULL, 
108                          void* pUserContext = NULL );
109HRESULT DXUTCreateDeviceFromSettings( DXUTDeviceSettings* pDeviceSettings, bool bPreserveInput = falsebool bClipWindowToSingleAdapter = true );
110HRESULT DXUTSetDevice( IDirect3DDevice9* pd3dDevice );
111
112// Choose either DXUTMainLoop or implement your own main loop 
113HRESULT DXUTMainLoop( HACCEL hAccel = NULL );
114
115// If not using DXUTMainLoop consider using DXUTRender3DEnvironment
116void DXUTRender3DEnvironment(); 
117
118
119//--------------------------------------------------------------------------------------
120// Finding valid device settings
121//--------------------------------------------------------------------------------------
122enum DXUT_MATCH_TYPE
123{
124    DXUTMT_IGNORE_INPUT = 0,  // Use the closest valid value to a default 
125    DXUTMT_PRESERVE_INPUT,    // Use input without change, but may cause no valid device to be found
126    DXUTMT_CLOSEST_TO_INPUT   // Use the closest valid value to the input 
127}
;
128
129struct DXUTMatchOptions
130{
131    DXUT_MATCH_TYPE eAdapterOrdinal;
132    DXUT_MATCH_TYPE eDeviceType;
133    DXUT_MATCH_TYPE eWindowed;
134    DXUT_MATCH_TYPE eAdapterFormat;
135    DXUT_MATCH_TYPE eVertexProcessing;
136    DXUT_MATCH_TYPE eResolution;
137    DXUT_MATCH_TYPE eBackBufferFormat;
138    DXUT_MATCH_TYPE eBackBufferCount;
139    DXUT_MATCH_TYPE eMultiSample;
140    DXUT_MATCH_TYPE eSwapEffect;
141    DXUT_MATCH_TYPE eDepthFormat;
142    DXUT_MATCH_TYPE eStencilFormat;
143    DXUT_MATCH_TYPE ePresentFlags;
144    DXUT_MATCH_TYPE eRefreshRate;
145    DXUT_MATCH_TYPE ePresentInterval;
146}
;
147
148HRESULT DXUTFindValidDeviceSettings( DXUTDeviceSettings* pOut, DXUTDeviceSettings* pIn = NULL, DXUTMatchOptions* pMatchOptions = NULL );
149
150
151//--------------------------------------------------------------------------------------
152// Common Tasks 
153//--------------------------------------------------------------------------------------
154void    DXUTSetCursorSettings( bool bShowCursorWhenFullScreen, bool bClipCursorWhenFullScreen );
155void    DXUTSetMultimonSettings( bool bAutoChangeAdapter );
156void    DXUTSetShortcutKeySettings( bool bAllowWhenFullscreen = falsebool bAllowWhenWindowed = true ); // Controls the Windows key, and accessibility shortcut keys
157void    DXUTSetWindowSettings( bool bCallDefWindowProc = true );
158void    DXUTSetConstantFrameTime( bool bConstantFrameTime, float fTimePerFrame = 0.0163f );
159HRESULT DXUTSetTimer( LPDXUTCALLBACKTIMER pCallbackTimer, float fTimeoutInSecs = 1.0f, UINT* pnIDEvent = NULL, void* pCallbackUserContext = NULL );
160HRESULT DXUTKillTimer( UINT nIDEvent );
161HRESULT DXUTToggleFullScreen();
162HRESULT DXUTToggleREF();
163void    DXUTPause( bool bPauseTime, bool bPauseRendering );
164void    DXUTResetFrameworkState();
165void    DXUTShutdown( int nExitCode = 0 );
166
167
168//--------------------------------------------------------------------------------------
169// State Retrieval  
170//--------------------------------------------------------------------------------------
171IDirect3D9*             DXUTGetD3DObject(); // Does not addref unlike typical Get* APIs
172IDirect3DDevice9*       DXUTGetD3DDevice(); // Does not addref unlike typical Get* APIs
173DXUTDeviceSettings      DXUTGetDeviceSettings(); 
174D3DPRESENT_PARAMETERS   DXUTGetPresentParameters();
175const D3DSURFACE_DESC*  DXUTGetBackBufferSurfaceDesc();
176const D3DCAPS9*         DXUTGetDeviceCaps();
177HINSTANCE               DXUTGetHINSTANCE();
178HWND                    DXUTGetHWND();
179HWND                    DXUTGetHWNDFocus();
180HWND                    DXUTGetHWNDDeviceFullScreen();
181HWND                    DXUTGetHWNDDeviceWindowed();
182RECT                    DXUTGetWindowClientRect();
183RECT                    DXUTGetWindowClientRectAtModeChange(); // Useful for returning to windowed mode with the same resolution as before toggle to full screen mode
184RECT                    DXUTGetFullsceenClientRectAtModeChange(); // Useful for returning to full screen mode with the same resolution as before toggle to windowed mode
185double                  DXUTGetTime();
186float                   DXUTGetElapsedTime();
187bool                    DXUTIsWindowed();
188float                   DXUTGetFPS();
189LPCWSTR                 DXUTGetWindowTitle();
190LPCWSTR                 DXUTGetFrameStats( bool bIncludeFPS = false );
191LPCWSTR                 DXUTGetDeviceStats();
192bool                    DXUTIsRenderingPaused();
193bool                    DXUTIsTimePaused();
194bool                    DXUTIsActive();
195int                     DXUTGetExitCode();
196bool                    DXUTGetShowMsgBoxOnError();
197bool                    DXUTGetHandleDefaultHotkeys();
198bool                    DXUTIsKeyDown( BYTE vKey ); // Pass a virtual-key code, ex. VK_F1, 'A', VK_RETURN, VK_LSHIFT, etc
199bool                    DXUTIsMouseButtonDown( BYTE vButton ); // Pass a virtual-key code: VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_XBUTTON1, VK_XBUTTON2
200bool                    DXUTGetAutomation();  // Returns true if -automation parameter is used to launch the app
201
202#endif
203
204
205
206
207

千萬別被代碼嚇住。對于不需要深入理解的我們來說,大多數(shù)都是不需要關(guān)心的。如果您需要深入理解的話,我非常抱歉我?guī)筒簧厦ΑT贑PPBLOG里面有個(gè)標(biāo)題為“天行健 君子當(dāng)自強(qiáng)不息”的一個(gè)BLOG里面有專門詳細(xì)解析DXUT的文章。鏈接請自己百度一下吧。

于是我們來關(guān)注一下這個(gè)優(yōu)美的框架。它定義了很多回調(diào)函數(shù),以及留了許多接口。
我們需要關(guān)心的是這幾個(gè):
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
      掛接每幀渲染場景時(shí)的回調(diào)函數(shù)
DXUTSetCallbackFrameMove
      掛接每幀渲染前需要更新場景時(shí)的回調(diào)函數(shù)
DXUTSetCallbackMouse
      掛接鼠標(biāo)事件的回調(diào)函數(shù)
DXUTSetCallbackKeyboard
      掛接鍵盤事件的回調(diào)函數(shù)

于是我們打開EmptyProject.cpp
看著WinMain函數(shù)
 1//--------------------------------------------------------------------------------------
 2// Initialize everything and go into a render loop
 3//--------------------------------------------------------------------------------------
 4INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
 5{
 6
 7    //設(shè)置回調(diào)函數(shù)
 8    DXUTSetCallbackDeviceCreated( OnCreateDevice );
 9    DXUTSetCallbackDeviceReset( OnResetDevice );
10    DXUTSetCallbackDeviceLost( OnLostDevice );
11    DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
12    DXUTSetCallbackMsgProc( MsgProc );
13    DXUTSetCallbackFrameRender( OnFrameRender );
14    DXUTSetCallbackFrameMove( OnFrameMove );
15    DXUTSetCallbackMouse( OnMouseEvent ,true);//第二個(gè)參數(shù)是指是否包含鼠標(biāo)移動(dòng)事件
16    DXUTSetCallbackKeyboard( OnKeyEvent );
17   
18    // 這里寫在程序底層初始化前需要的代碼
19
20
21    // 初始化DXUT、程序窗口、Direct3D設(shè)備
22    DXUTInit( truefalsetrue ); // Parse the command line, handle the default hotkeys, and show msgboxes
23    DXUTSetCursorSettings( truetrue ); // Show the cursor and clip it when in full screen
24    DXUTCreateWindow( “EmptyProject”);//窗口標(biāo)題
25    DXUTCreateDevice( D3DADAPTER_DEFAULT, true640480, IsDeviceAcceptable, ModifyDeviceSettings );//創(chuàng)建設(shè)備
26    // 開始DXUT主循環(huán)
27    DXUTMainLoop();
28
29    // 這里寫清理底層的代碼
30    return DXUTGetExitCode();
31}

看見了么,在這里掛接了需要的回調(diào)函數(shù),不如我們將他們叫做“事件”,這樣更好理解。
自己看一下就能明白那些代碼的意思了

OnCreateDevice OnResetDevice OnLostDevice OnDestroyDevice MSgProc OnFrameRender OnFrameMove OnMouseEvent OnKetEvent
這些都是已經(jīng)定義好的CALLBACK,我們的框架將從DXUTMainLoop()這里開始

簡單來說,我們需要了解的就只有這些事件的觸發(fā)順序了。
HRESULT CALLBACK OnCreateDevice( Device* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
      這個(gè)事件在設(shè)備創(chuàng)建完畢時(shí)就會觸發(fā),最先觸發(fā)的東西。第一個(gè)參數(shù)是創(chuàng)建后的設(shè)備,第二個(gè)是設(shè)備的表面參數(shù)。pUserContext不需要關(guān)心,因此不討論。下同。

HRESULT CALLBACK OnResetDevice( Device* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
      這個(gè)事件在設(shè)備重置的時(shí)候會觸發(fā)。那么什么叫做設(shè)備重置呢?等下會和設(shè)備丟失一起說。第一個(gè)參數(shù)是重置后的設(shè)備,第二個(gè)是重置后設(shè)備的表面參數(shù)。

void CALLBACK OnLostDevice( void* pUserContext )
      這個(gè)事件在設(shè)備丟失的時(shí)候會觸發(fā)。舉個(gè)簡單的例子,把窗口最小化的時(shí)候設(shè)備會丟失,而恢復(fù)的時(shí)候設(shè)備會重置。從全屏換為窗口的時(shí)候也會丟失并且重置。大概就是改變窗口的大小、位置、是否全屏的時(shí)候,會導(dǎo)致設(shè)備丟失,隨后恢復(fù)的時(shí)候會重置。這兩個(gè)事件的觸發(fā)就是為了在窗口改變的時(shí)候重新設(shè)置一些參數(shù),讓畫面適應(yīng)當(dāng)前窗口設(shè)置。

void CALLBACK OnFrameMove( Device* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
      這個(gè)事件在每幀繪制前會觸發(fā),為的是更新場景信息。第一個(gè)參數(shù)是傳入的Direct3D設(shè)備,第二個(gè)參數(shù)是從第一次觸發(fā)這個(gè)事件到現(xiàn)在為止的時(shí)間,第三個(gè)參數(shù)是這次觸發(fā)此事件距上次的時(shí)間。

void CALLBACK OnFrameRender( Device* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
      這個(gè)事件在每幀渲染屏幕的時(shí)候觸發(fā)。參數(shù)意義和OnFrameMove一樣。

void CALLBACK OnMouseEvent(bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown, bool bSideButton1Down,
         bool bSideButton2Down, int nMouseWheelDelta, int xPos, int yPos, void* pUserContext)
      這個(gè)事件在鼠標(biāo)有動(dòng)作的時(shí)候觸發(fā)。bLeftButtonDown:左鍵是否按下,bRighButtonDown:右鍵是否按下,bMiddleButtonDown:中間鍵是否按下,bSidebutton1Down:邊鍵1是否按下,bSideButton2Down:邊鍵2是否按下,nMouseWheelDelta:滾輪的滾動(dòng)值,向手指指的方向滾動(dòng)一格是-120,反之則為120,xPos:在窗口中的X坐標(biāo),yPos:在窗口中的Y坐標(biāo)。

void CALLBACK OnKeyEvent( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
      這個(gè)事件在鍵盤有動(dòng)作的時(shí)候觸發(fā)。nChar:發(fā)生動(dòng)作的鍵,bKeyDown:發(fā)生動(dòng)作的鍵是被按下還是被抬起,bAltDown:Alt鍵是否同時(shí)被按下。



這些了解了后,你就可以開始干事兒了。你可以把上面的回調(diào)函數(shù)都當(dāng)做事件來看,而且是多線程的,這樣更方便。
總結(jié)一下事件順序:
                                   

如上圖所示,DXUT的工作順序大概就是這樣。對于不需要深入了解DXUT工作細(xì)節(jié)來說,已經(jīng)差不多了。


現(xiàn)在應(yīng)該對框架的工作機(jī)制有一定得認(rèn)識了,這篇簡單的文章也就這樣結(jié)束了。下一篇還是預(yù)告了吧,是在DXUT框架下,關(guān)于2D方面的東西。

順便說一些DXUT.h中比較實(shí)用的接口
163行:void    DXUTPause( bool bPauseTime, bool bPauseRendering ); 讓OnFrameMove和OnFrameRender事件暫停或恢復(fù)觸發(fā),第一個(gè)參數(shù)為是否停止計(jì)時(shí),第二個(gè)為是否停止繪制。
178行:HWND DXUTGetHWND();獲取目前窗口句柄
182行:RECT DXUTGetWindowClientRect();
188行:float DXUTGetFPS();獲取當(dāng)前的FPS(Frame Per second 每秒幀數(shù))
差不多就這些。

以上的代碼在EmptyProject里面全部都有,這篇文章只是幫還沒有接觸過的新手入門而已。請勿鄙視,有任何意見和建議請?zhí)岢觯x謝了。

現(xiàn)在已經(jīng)傻瓜式地把框架搭建好了,并且可以簡單使用了。那么下一步該干嘛?干事兒唄。
下一篇:Direct3D中的簡單2D運(yùn)用。有空再寫了,先預(yù)告了吧。