D3D9Samples(7)--EmptyProject
打开Emptyproject,编译后运行,界面如下:
这个例子是DXUT框架的最基础的使用。DXUT是微软提供的一个对D3D9/D3D10 API封装的框架(Framework)。为了简化繁杂的API的使用,让开发者的注意力集中在关键技术点上。当然,随着D3D 11的推出,新的DXUT11框架取代了DXUT。
进入WinMain函数,可以看到对DXUT的使用很简单,大致三步:
1. 设置回调函数
DXUTSetCallbackD3D9DeviceAcceptable
设置LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE回调,在创建D3D9设备之前响应此回调,用以检查此设备是否满足需要,即显卡性能是否能满足程序的需要。
DXUTSetCallbackD3D9DeviceCreated
设置LPDXUTCALLBACKD3D9DEVICECREATED回调,在创建D3D9设备之后响应此回调,用以创建内存池为D3DPOOL_MANAGED、D3DPOOL_SYSTEMMEM的各种类型的D3D资源;以及创建其他非资源类D3D对象,如创建shader、effect等。
DXUTSetCallbackD3D9DeviceReset
设置LPDXUTCALLBACKD3D9DEVICERESET回调,在重置D3D9设备之后响应此回调,用以创建内存池为D3DPOOL_DEFAULT的D3D资源。
DXUTSetCallbackD3D9FrameRender
设置LPDXUTCALLBACKD3D9FRAMERENDER回调,在D3D9渲染一帧写入BackBuffer时,显示该buffer内容之前回调。在此可以进行各种资源的绘制工作。
DXUTSetCallbackD3D9DeviceLost
设置LPDXUTCALLBACKD3D9DEVICELOST回调调,在D3D9设备丢失时回调,所有在LPDXUTCALLBACKD3D9DEVICERESET中创建的内存池为D3DPOOL_DEFAULT的资源对象在这里都要释放掉。
DXUTSetCallbackD3D9DeviceDestroyed
设置LPDXUTCALLBACKD3D9DEVICEDESTROYED回调,在销毁D3D9设备时回调,在这里要释放掉在LPDXUTCALLBACKD3D9DEVICECREATED中创建的内存池为D3DPOOL_MANAGED、D3DPOOL_SYSTEMMEM的资源对象。
DXUTSetCallbackDeviceChanging
设置LPDXUTCALLBACKMODIFYDEVICESETTINGS回调,在创建D3D设备之前响应此回调。DXUT11已经为创建D3D设备而准备了默认设置,在此可以改变设置。
DXUTSetCallbackMsgProc
设置LPDXUTCALLBACKMSGPROC回调,在收到Windows窗口消息时回调,在此可截取各种WM_*消息,并进行处理。
DXUTSetCallbackFrameMove
设置LPDXUTCALLBACKFRAMEMOVE回调,在渲染每一帧画面之前回调,在此可以对数据进行更新。比如计算物体运动等。
2. 初始化DXUT
DXUTInit
这个函数主要是解析命令行参数,告诉DXUT是否要弹出错误框(如果出错),以及是否要线程安全(设置和读取一个值时保证多线程下安全)。WinMain中也可以不用这个函数,DXUT会自行调用,并使用默认参数。默认是显示错误框,线程不安全的。
DXUTSetHotkeyHandling
是否启用Alt+Enter触发全屏切换
是否启用Esc触发退出程序。
是否启用暂停触发时钟暂停。
DXUTSetCursorSettings
在全屏下是否显示光标,是否剪裁光标(当光标只有一部分在视角内时)
DXUTCreateWindow
创建窗口
DXUTCreateDevice
创建Direct3D设备
3. 开始DXUT主循环
DXUTMainLoop
在主循环中取窗口消息,如果没收到WM_QUIT退出消息,就一直在主循环中,在空闲时间(idle time)进行D3D的绘制。
4. 退出时返回DXUT提供的错误代码
DXUTGetExitCode