恩,继续直接正题了。

DirectX简介

##DirectX简介

我们首先可以想到,在我们玩3D游戏时,通常会对我们的显卡进行一些要求,而实际上,现在没有一款3D游戏要求我们使用某一种型号某一个厂家生产的显卡,而不同计算机的硬件是有一定区别的,为什么我们的一套程序能够适用于多款类型的显卡呢?这是因为我们采用了一个通用的开发工具,它作为一种桥梁般的沟通了我们游戏的应用程序和显卡,避免了我们对显卡硬件的直接访问,而这种工具当前流行的主要有两种:OpenGL和Direct3D。

OpenGL(Open Graphics Library)开放图形库出现的比D3D更早,它使老一辈的程序员很容易的在PC机上用C语言去开发复杂的三维图形,在VC中,微软也为我们提供绑定的一些OpenGL函数库,如GLU32.lib实用库,GLAUX.lib辅助库,OpenGL32.lib GL库,他们也而已使我们方便快速的生成漂亮图形。

OpenGL程序拥有着一套渲染流水线,先将几何顶点数据和图象象素数据导入相应的存储空间,再通过运算器进行逐个顶点的变换操作(设置视点等矩阵)和图元组装,同时进行着纹理映射工作,之后将其光栅化,再次逐个顶点操作,将其放置入桢缓冲区进行显示。而我们在DX中也是进行相同的操作。

说了半天OpenGl,我们接下来更详细的说下DX。

DirectX是微软公司开发的,运行于计算机平台下的,多媒体控制处理引擎。它的API均是运行在HAL硬件抽象层之上,能够更充分的利用系统硬件加速功能,而同时它又隐藏了硬件相关的设备特性,所以我认为它具有更高的效率和更方便的开发。

我们应该清楚,Direct8.0之前,D3D和DirectDraw是分离开来的,DirectDraw你可以更简单的理解为主要为2D图象操作而设计的,而现在它和Direct3D被集成到一个Graphics的接口中了,所以,在你学习D3D的过程中,完全可以根据自己兴趣去自学一下2D游戏的制作,它会比3D游戏简单的多,而且很大程度下,使用D3D制作2D游戏会比MFC简单的多。

学习DirectX,你必须了解它的一个很大特性,那就是COM和HAL。这两个技术为D3D提供了一个通用接口和向后兼容的能力,还使我们的D3D程序在不同硬件之上能够发挥着最快的速度。

COM是组件对象模型Componment Object Model的缩写,它是一种实现软件模块之间的二进制连接的协议。当这种协议连接成立后,两个程序的模块就通过“接口”来实现通信功能,所以我很喜欢将它理解成一个桥梁。恩,我们长用的ActiveX也是一种COM组件的代表。

COM控件实现细节相当复杂,我没有能力在这里讲述,有兴趣的朋友可以自行查找书籍,作为D3D游戏制作人员,个人认为只要了解其接口的用法就差不多了。这里可以简单为大家说一下HAL和COM技术提供给我们的优势。

  1. 由于COM控件的要求,每一代DX版本更新时,都会延续以往的API,接口永不改变。(呃,那个邪恶的基类函数名似乎叫IKnowNo?)

  2. 当我们的硬件显卡不支持某种D3D特性时,我们会有一种相对低效率的机制来保证程序的运行,意思即任何效果无论你显卡是否支持,均可实现该效果的模拟。(因为某志个人电脑教差,这点可是帮了某志大忙了T T)

  3. DX版本更新时,原API保存,即使你的DX版本是9.0C了,依旧是可以支持8,0下开发的游戏,原因就在此。

  4. COM控件其中完全没有类成员变量,而且几乎全是虚类。这就使得应用程序无法直接访问COM对象,仅可以使用其接口指针来实现相应功能,这有比较好的安全性。

  5. COM是独立于语言的。

当然,按照第2条来说,那么我们岂非没必要要显卡了?反正HAL机制可以帮助我们去模拟任何特性。需要说明的是HAL(Hardware Abstraction Layer)硬件抽象层的运作是有条件的,它会优先判断你机器上的显卡能力,当你程序的部分特性不受硬件支持时,它将进行关闭或者以一种很低效的方法来实现模拟,这种模拟不仅会导致图象质量的降低,还超级影响你的电脑运行速率,和显卡硬件实现功能速率是完全无法相比的。所以,尽可能的,我们还是以显卡来进行图象的处理,只有无法处理的时候再考虑HAL模拟吧。

关于整个DX功能的说明,我再整体的说明一下

Win32程序—-》D3D API—-》HAL设备—–》显卡驱动程序接口—-》显卡硬件

呃,忘记说明一点了,DirectX我爱称呼为DX,Direct3D我爱称呼为D3D,这两者不是等价的。

D3D仅仅是DX开发库中一部分组件而已。我在下面说明一下DX开发组件包含哪些部分及其大致功能。

  • 首先最重要的DX Graphics–包括D3D和DirectDraw。这些组件用于进行图象的渲染
  • DX Audio–包括DirectMusic和DirectSound,前者是负责部分音频的解码工作,后者是对基本音频文件进行播放。
  • DirectPlay–现在这个基本被微软放弃了,原本是实现游戏之间的网络通讯的功能,后来发现它远远没有专门的软件程序有效,终于停止更新。
  • DirectInput–用于管理鼠标键盘等输入输出设备
  • DirectShow–用于在游戏中多媒体文件的解码播放,后来微软也不再更新,放弃了。

而我准备复习并讲述的则是DX Graphics控件的D3D部分。

我们已经知道DX是基于COM来开发实现的,那么我们该如何使用它呢?其实很简单,我们需要做的工作仅仅就三步:

  1. 调用适当的函数来获取相应接口的指针
  2. 调用这个接口的成员函数来完成所需要做的功能
  3. 使用完毕接口后,调用Release方法来释放相应指针

当然,我们接下来需要做的就是去了解其中接口的功能,来实现我们的程序。