Beginning DirectX 10 Game Programming(Chapter 01 DirectX介绍)

来源:互联网 发布:微信拼团源码 编辑:程序博客网 时间:2024/05/15 12:55

    DirectX是Windows平台下的游戏API。几年前,游戏开发者纠结于硬件的不兼容,很难让每个人玩上同一个游戏。随后,微软推出了DirectX。它为游戏开发者提供一个单一而干净的API,可以超越不同种类的硬件来达到兼容性。由于DirectX的发行,Windows平台下的游戏数量显著增长。
    
    在这一章,会包含以下内容:
  • 理解DirectX是什么
  • 为什么DirectX很有用
  • 数据流如何穿过Direct3D 10的管线
  • Direct3D 10 的新内容
什么是DirecX?
    DirectX是微软的一套API集合,为游戏开发者提供在Windows平台下PC机硬件的底层接口。每个API组件用于访问不同的硬件,包括图形,声音和网络。这个接口允许开发者只使用一套函数来写游戏,不需担心考虑游戏运行时的硬件情况。

为什么需要DirectX?
    在Windows系统发布之前,开发者为DOS开发游戏。这个单线程,无GUI的操作系统为开发者在他们的程序代码和硬件之间提供直接路径。这样好坏均有。比如,由于在游戏代码和硬件间有直接路径,开发者可以榨干硬件的每一份能力,让他们完全控制游戏的执行。不好的一面不仅要对硬件直接编程,还要使用硬件支持的第三方库,甚至是显卡和声卡。
    由于显卡没有一个通用标准,所以尤其复杂。即使大部分显卡支持一套通用分辨率,开发者依然需要直接访问显存。这使得在屏幕上绘图非常困难。开发者当然会寻找一个更好而且简单的方法。
    Windows3.1发布,但它还是具有DOS的局限性。Windows运行于DOS的上层,严格限制游戏的可利用资源,而且不再让开发者能直接访问硬件。所以当时为Windows平台写的游戏主要是卡片和图板游戏。而大部分游戏依然只支持DOS。
    Windows95的发行依然没有解决这个问题。直到DirectX 1,也叫 Game SDK的发行。它为开发者提供一个单一库,处于游戏与硬件之间的通用层;使得向屏幕绘图变得非常简便。第一个版本的DirectX没有为所有的外部硬件提供支持,但这给游戏开发者带来一个很好的开始。随后几年,DirectX发行了多个版本,每一次均有对新技术的提升与添加,比如网络支持、流体音频和新的输入设备。最新版本的DirectX是DirectX 10,配合Windows Vista。(译注:现在最新的版本是DirectX11.1,配合win8)

 DirectX的组合
    DirectX是基于各种代码库的集合,每一个库都为游戏或多媒体应用提供一系列通用功能。DirectX由多个组件构成,只需确认你的游戏链接上了需要的功能。

组件
    DirectX的API分布于多个组件,每一个代表了系统的不同面。各个API可以相互独立使用,因而只需添加你的游戏所必需的功能。
    在DirectX 10中,一些组件被更新了,比如Direct3D,而其他依然保持。DirectX的组件可以因新功能的增加而单独升级。
  • DirectX Grophic. 该组件用于所有的图像处理。这个API为2D和3D图形的绘制提供函数,不仅可以初始化游戏还可以为游戏设置环境贴图。
  • DirectInput. 所有的用户输入可以通过该API处理。这个组件包含了对键盘,鼠标,手柄,游戏杆等设备的支持。DirectXInput也对力量反馈提供支持。
  • XInput. DiretX API的新成员。用于连接新的Xbox 360控制器.
  • DirectSound. 用于添加音效或背景音乐。DirectXSound允许加载和播放一个或多个声音文件,并完全控制他们的播放。
  • DirectSetup. 你的游戏完成后,你想传给其他人。DirectSetup提供函数用于在用户电脑上安装最新版本的DirectX。

注:在DirectX的早期版本(DirectX8以前),2D的绘制由DirectDraw组件提供。因为DirectDraw没再更新,则所有的绘制都得使用3D。(译注:在DirectX11中,2D的绘制可以通过新的组件Direct2D来实现,当然,用3D来绘制依然可行)


COM组件
    DirectX的API基于COM组件。COM组件由一系列接口组成,开发者通过接口访问DirectX。COM组件一般就是注册到系统的DLL文件,为机器上的特殊硬件提供支持。对于DirectX COM组件来说,注册发生于安装DirectX的时候。虽然与C++的对象有些相似,但COM组件需要用接口访问函数。在一个COM组件中可能会有一个接口的多个版本,这样就允许向后兼容。
    例如,每一个版本的DirectX不仅含有被更新接口的新版本,同时也包含前一个版本,以免已有的代码报废。因此,使用Direct7开发的游戏只需小小改动就能运行于DirectX9。
    COM组件另一个优势是支持多种语言而不仅仅是C++。开发者可以使用VB,C++,C#来调用相同的DirectX库。随着微软对DirectX更新并添加新的功能,每一个被更新的组件的版本号也会增加。你将会发现DirectX的所有现有组件不是相同的等级。比如,DirectSound依然是8.0版,而Direct3D已经10.0了(译者注:现在D3D已经11.1了)。

Direct3D 10介绍
    在Windows Vista中,微软引入了Direct3D 10(D3D10)这个新的图形API。这个版本里,Direct3D有重大的改变,将API流线化,抛弃了大量冗余代码。WindowsVista的整个桌面就是基于D3D10,这让用户超越了2D工作区,桌面上每一个窗口均3D化。这一切是因为显卡上的GPU成为了可共享资源。
    显卡的升级为用户提供了D3D10所需要的功能。在早期的DX版本中,显卡厂商仅仅为Direct3D提供部分兼容性,造成各种各样的纠结。比如你买了一个最新的游戏,但你根本无法确定你的显卡是否可以完全支持游戏所需的特性。而在D3D10中,所有的显卡厂商都必须让硬件和相应驱动来兼容全部特性。这让显卡购买者受益匪浅,因为厂商不会只支持一部分他们认为重要的特性。
    由于Direct3D的大量改动,使得Direct3D10不能在早期的Windows中运行(Windows XP不被支持)。这将是DirectX第一次不再向后兼容。你在用D3D10写游戏时得记住这点,因为这个游戏的运行基础是用户已经换成Vista了。(译者注:现在最新的DirectX11依然如此,只能用于Vista和之后的版本。这就是为什么XP系统不能玩DX11游戏。)

Direct3D的流程
    Direct3D不仅仅是一个API,还是一个将简单几何体和图片变换为一个真实世界的工具。你可以把Direct3D看作黑盒来使用,不需要关心内部实现细节,这很适合用来理解它的工作原理。
    D3D分多个阶段来处理你的场景,每个阶段执行特定的任务,最后得到最终效果。
    第一阶段是 输入装配阶段,可以想象成搭积木。这个时候,你将组成工程的基本积木放入D3D管线(流水线)。
    接着是顶点被传递进顶点着色的阶段。场景中的每一个顶点均被单独传递进顶点着色器然后立即着色而发生变化。你会在本书后面的章节学习着色器相关知识。这个阶段可以通过着色器进行配置。
    第三阶段是几何着色,这是D3D10新增的。几何着色的引入使得完整的基元可以作为一个整体来进行变换,比如三角形,线条。而在以前,基元的每一个顶点均要使用顶点着色来单独处理。这个阶段也可通过着色器进行配置。
    第四个阶段,光栅化。用于将3D场景变换为实际像素表示。在图片绘制前,任何超出视口的像素将被裁减。
    像素着色阶段是你的场景中像素被处理的时候。就像顶点,组成基元的每一个像素均要被投入像素着色器。像素着色器允许你决定场景中的物体在最终效果中将如何出现。你可以添加光照,处理环境贴图,或者只是传递像素。这个阶段也可以通过着色器进行配置。
    最后阶段是输出合并阶段,用于将所有打包。该阶段把从管线其他阶段处理后的零件打包生成最终效果,然后传递给屏幕。
Direct3D管线各阶段
  1. 输入装配阶段
  2. 顶点着色阶段
  3. 几何着色阶段
  4. 光栅化阶段
  5. 像素着色阶段
  6.  输出合并阶段
  7. 输出显示阶段
Direct3D 10注意事项
    可能有些人对使用DirectX编写游戏已经很熟悉了,这样的话,在你将游戏转化为最新版D3D时,只需稍加注意即可。
    最大的变化是移出了固定管线功能。以前,你可以选择一种默认方式来处理3D场景,然后D3D来处理裁减,光照和着色。但如今,D3D10的引进使得这一切需要用可编程管线的操作来做特殊处理。在关于着色器的章节里会向你介绍最新的情况。
    另一个主要的变化是移出了CAPS。在以前的D3D中,你必须检查视频硬件的潜在能力来确定某些功能比如像素着色是否可用。但现在,硬件没有提供的任何特性均会由系统用软件模拟出来。这样,使用D3D10可以明显简化游戏的初始化代码。

总结
    在进行DirectX的学习时,不要担心有时候内容量庞大。DirectX是一个很庞大的API,它覆盖了大量不同的系统。选择一个系统然后尽你的能力编写类似示例的代码。不知不觉间,事情会开始变得有意思而且逐渐被理解。如果你遇到了困难,记住, 你不是一个人在战斗,gamedev.net和微软的MSDN是寻求帮助最好的地方。

原创粉丝点击