D3D9 Samples(8)--SimpleSample
打开SimpleSample项目。编译后运行,界面如下:
这个例子展示了一个简单的DXUT框架运用,后面的例子大都是在这个基础之上。相比上一个sample,增加了以下内容:
1. GUI相关接口
CDXUTDialogResourceManager g_DialogResourceManager;// manager for shared resources of dialogs
用于管理GUI所需的资源,主要包括字体Font、贴图Texture。
CDXUTDialog g_HUD; // dialog for standard controls
DXUT Sample的标准对话框,即右上角包含三个按钮的区域。几乎每个使用DXUT的sample都有这个对话框。第一个按钮是切换全屏和窗口模式;第二个按钮是切换REF和HAL设备;第三个按钮用以调出下面的设备配置对话框。
CD3DSettingsDlg g_SettingsDlg; // Device settings dialog
设备配置对话框,可在此修改D3D的各种设备配置。如下图所示:
CDXUTDialog g_SampleUI; // dialog for sample specific controls
给用户添加控件的对话框,本sample中未添加任何控件。
这几个对象以及控件均在InitApp中完成初始化。并在D3D的Device状态变化时调用相对应的响应函数,如OnD3D9CreateDevice、OnD3D9ResetDevice、OnD3D9LostDevice、OnD3D9DestroyDevice。在MsgProc中传入并处理需要的窗口消息(如键盘、鼠标输入等)。绘制每帧时,调用dlg的OnRender进行绘制。GUI的事件控制逻辑在OnGUIEvent中。
2. 模型查看摄像机
CModelViewerCamera g_Camera; // A model viewing camera
该Camera接口由DXUT提供,使用了ArcBall球路径算法,用于查看模型。
在OnD3D9CreateDevice中初始化摄像机参数:eye位置和look at位置。
在OnD3D9ResetDevice中设置投影参数以及窗口大小参数。
在OnFrameMove中实现摄像机的运动逻辑:FrameMove。
在MsgProc中接收窗口消息(如键盘、鼠标输入等):HandleMessages
3. 左上角信息显示的文本相关接口
ID3DXFont* g_pFont9 =NULL;
g_pFont9是字体资源,在OnD3D9CreateDevice中创建。
ID3DXSprite* g_pSprite9 =NULL;
g_pSprite9是精灵资源,在OnD3D9ResetDevice中创建。
CDXUTTextHelper* g_pTxtHelper =NULL;
将上面两个资源传给g_pTxtHelper,它封装了文字的绘制。
4. 管理实现Shader的Effect相关接口
ID3DXEffect* g_pEffect9 =NULL;
Effect是D3D提供的一套简化Shader开发的接口,方便的管理渲染状态。在OnD3D9CreateDevice中通过D3DXCreateEffectFromFile加载.fx文件得到该接口。并得到下面三个句柄用于读写Shader中的全局变量:
D3DXHANDLE g_hmWorldViewProjection;
D3DXHANDLE g_hmWorld;
D3DXHANDLE g_hfTime;
ID3DXEffect同样提供了OnResetDevice和OnLostDevice来响应Device状态的变化。在渲染一帧OnD3D9FrameRender时通过ID3DXEffect::SetMatrix和ID3DXEffect::SetFloat为Shader全局变量设置指定的值。