D3D龙书范例代码结构分析
来源:互联网 发布:对网络直播的利弊 编辑:程序博客网 时间:2024/05/08 15:31
最近在看Luna大神写得Introduction To Direct 3D那本书,也就是大家说的DX龙书,书里面的所有例程都是使用一个小的框架来实现的。最近几天,我仔细阅读了几遍代码,终于在VA的自动提示功能的帮助下自己重写了一遍。。这里主要相对这个框架进行一个简单的分析,并且帮助像我这样的初学者们记忆!各位大牛就可以绕过了。。。
首先,这个框架有3个文件组成,d3dUtility.h/cpp与d3dinit.cpp。编写的时候应该首先从d3dUtility.h开始。
在这个头文件中,包含了5个函数:initD3D, EnterMsgLoop, WndProc, Release和Delete。其中后两个是两个模板函数,主要用于Release和Delete对象,这两个函数比较简单,这里就不说明了。
接下来,就需要在d3dUtility.cpp中实现这几个函数。由于WndProc牵扯到对游戏的控制(WM_KEYDOWN消息的处理在WndProc这个回调函数中),所以作者选择将这个函数放到d3dinit.cpp中进行编写。先看EnterMsgLoop这个函数:
这个函数中,主要就是对MSG的对象msg的判断,根据其消息类型判断,如果没有消息,那么就调用绘图函数进行绘制,这个对于有过Windows游戏编程经验的人来说,应该不会陌生。
接下来是最关键的D3D初始化部分代码,d3dInit()这个函数。这个函数可以看成两大部分,第一部分是对Windows窗口的初始化,分为4步:
1.填充WNDCLASS结构体,并调用RegisterClass注册这个结构体。
2.利用CreateWindow这个函数创建HWND对象。
3.调用ShowWindow方法显示窗体。
4.调用UpdateWindow方法更新窗体。
需要注意的是,由于作者把d3dUtility放到了d3d这个命名空间中,因此这里我们需要使用::来应用以上的这些函数。
然后就该初始化D3D了。初始化D3D的目的是为了创建IDirect3DDevice对象,这个对象用于之后的绘制图像等功能。为了初始化D3D,也有四步:
1.创建IDirect3D9对象,这个对象主要用于获取设备的能力以及创建IDirect3DDevice对象。
2.利用D3DCAPS9对象获取显示卡的能力,并判断使用硬件顶点处理还是软件顶点处理。使用一个int数vp记录结果。其实这个vp还可以记录其他的设备信息,但是作为一本教程的实例代码,作者没有判断其他的Behavior。
3.填充D3DPRESENT_PARAMETERS结构。这个主要是设置显示的效果。
4.利用d3d9->CreateDevice创建device。
至此初始化工作就完成了。咱们的d3dUtility也实现的差不多了,只有一个WndProc函数没有实现,放到了d3dinit.cpp中来实现。
最后我们来看一下d3dinit.cpp这个文件。大体浏览一下代码,发现了WinMain这个函数。这个函数内部的执行思路非常清晰,首先初始化D3D,然后Setup,之后EnterMsgLoop,当用户选择退出之后(从EnterMsgLoop这个函数返回),则执行Cleanup方法,最后是释放IDirect3DDevice9对象,并返回。
--------------------------------------我叫分割线------------------------------------------------------------
总的来说,这个小框架的代码非常清晰,我们只需要修改d3dinit.cpp这个文件中的代码就可以来完成我们想要的效果了,使用起来非常方便。只需要编写对应的Setup、Cleanup和Display方法就行了。
今天先说到这里,继续研究去了~
- D3D龙书范例代码结构分析
- D3D龙书范例代码结构分析
- D3D程序基本结构
- D3D x文件结构
- D3D D3DXMATRIX 结构体
- 【D3D】一个D3D程序的基本结构
- sharetronix代码结构分析
- CAS代码结构分析
- QEMU代码结构分析
- OpenScales代码结构分析
- 彩信代码结构分析
- oschina代码结构分析
- 代码结构分析
- 代码范例
- 第一个D3D代码
- [Attila GPU] ATTILA GPU Streamer Unit (D3D Input Assambler) 结构分析
- GTK+2.0编程范例代码分析-第一章(1)
- GTK+2.0编程范例代码分析-第一章(2)
- oracle中的SCOTT用户 解除锁定
- A potentially dangerous Request.Path value was detected from the client 异常
- JDK不兼容异常(转)
- JSON应用 java&js
- 软件安全开发生命周期读书笔记
- D3D龙书范例代码结构分析
- VC++的Unicode编程
- 使用Perl实现系统服务监控和报警
- Linux下的多线程编程
- PCB布线
- 项目经理潜质和职责分析 --正式版
- SSAS实践问题记录--OLAP 存储引擎中存在错误: 处理时找到重复的属性键
- 第四讲 GridView 72般绝技
- FPGA EPCS烧写及NiosII Flash烧写过程