一、初识DirectX
DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染、交互式音乐和环境音效等高要求应用开发服务的。从Windows 95开始,人们就开始接触DirectX2.0,WindowsNT4.0里面则是DirectX3.0a,但是没有DirectX4的版本。到了Windows98,它就是Windows家族操作系统中不可缺少的核心成员之一。Windows 98中集成了DirectX5,Windows2000中集成了DirectX 6,Windows Me中集成了DirectX 7,而Windows XP天生就带了DirectX 8.1。
微软开发了DirectX标准平台,并且根据硬件制造厂商和游戏厂商合作共同更新升级DirectX的标准。硬件制造商按照此标准研发制造更好的产品,游戏开发者根据这套标准开发游戏。也就是说,无论硬件是否支持某种特效,只要DirectX标准中有,游戏开发者就可以把它写到游戏中,当这个游戏在硬件上运行,如果此硬件根据DirectX标准把这个效果做到了此硬件驱动程序中,驱动程序驾驭其硬件算出结果,用户就可以欣赏到此效果。这就是“硬件设备无关性”,是DirectX真正意义所在。
通常,Windows对硬件访问的管制非常严格,用通常的办法不易访问,但DirectX通过“硬件抽象层(HAL)”给予了开发人员直接访问硬件的能力,HAL不仅解决了硬件及兼容性问题,而且开发人员可以利用它直接访问计算机的某些硬件设备,例如显示设备的直接显存控制和渲染,键盘、鼠标和游戏杆的控制的直接访问控制,音频设备的直接音频混合与输出能力等等,因此开发人员可以充分利用硬件加速将程序的性能优化到一个新的高度,如果目标机器不支持相应的硬件加速,DirectX还可以仿真加速器以提供强大的多媒体环境。DirectX家族包含的成员有Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectSound和DirectShow。
二、DirectX全家福
通过上面的介绍,相信读者对DirectX已经有一个大概的了解。下面就让我们逐一认识它们吧。
1、Direct3D、DirectDraw和DirectGraphics
DirectDraw是DirectX家族中的元老,它为高速的2D渲染提供了良好的支持,由于其具备直接显存访问和位快传送的能力,使得2D图形的绘制速度相对GDI有了一个质的飞跃,其渲染速度甚至有上百倍的差距。在现在回忆当初玩“红色警戒”和“Diablo”的时候,大家可不要忘了DirectDraw的功劳。
DirectDraw在DirectX3.0时就已经接近极致,但是随着PC图形技术的飞速发展,人们逐渐不再满足于2D的图形效果,而通过2D技术实现伪3D模拟又非常损失效率,这种需求直接导致了Direct3D的诞生,早期的Direct3D技术不甚完善,相对于2D技术还有一定的差距,直到图形加速卡支持硬件3D特效后,Direct3D才逐渐步入正轨,慢慢显示出它的性能优势来。下面让我们来回顾一下历史,看看
Direct3D的“成长过程”:
DirectX6中的Direct3D添加了如下新特性:
•几何形体的灵活顶点格式定义
•几何形体的顶点缓冲存储
•支持多纹理渲染
•自动纹理管理
•可选深度缓冲(使用Z Buffer或W Buffer)
•通过凹凸环境贴图(BUMPENVMAP)为反光面和水波特效提供逐像素的渲染和贴图能力
DirectX7中的Direct3D添加了以下新特性:
•硬件坐标转换和灯光(T&L)支持
•立方体表面的环境贴图
•几何渲染
•改进的纹理渲染
•自动纹理坐标生成、纹理转换、投影纹理和任意面裁剪
•D3DX实用库
•支持Intel MMX架构、Intel单指令多数据流(SIMD)、SSE®和 AMD® 3DNow®架构。
DirectX的版本到了8.0的时候,虽然它依然保持着向前的兼容性,但是它的结构发生了巨大的变化,3D图形处理技术逐渐统一在Vertex Shader和Pixel Shader。Vertex Shader被用来描述和修饰3D物体的几何形状,同时也用来控制光亮和阴影;Pixel Shader则用来操纵物体表面的色彩和外观。Direct3D和DirectDraw合二为一,DirectX家族诞生了一个新的成员-----DirectGraphics。同时也增添了很多令人激动的特性:
•完全集成DirectDraw与Direct3D
简化程序初始化过程并提高数据分配和管理的性能,这将减少内存消耗。同时,集成后的图形应用编程接口(API)允许并行的顶点输入流以达到更加灵活的渲染。
•可编程顶点处理语言
允许你编写定制的着色器,如变形和渐变动画,矩阵调色板蒙皮,用户定义的光照模型,一般环境映射,可编程几何体或者任何其他开发者定义的算法。
•可编程像素处理语言
允许你编写定制的硬件着色器,例如通用纹理组合公式,逐像素光照(凹凸贴图),适用于实现照片(真实)级镜面效果的逐像素环境贴图或者任何其他开发者定义的算法。
•支持多重采样渲染
允许全场景反走样和多重采样效果,例如运动模糊及景深(镜头的聚焦效果)。
•点精灵
允许高性能的粒子系统渲染,例如火花、爆炸、雨、雪等等。
•3-D空间纹理
允许范围衰减,实现逐像素级光照及空间大气效果,甚至是更复杂的几何图形应用。
•支持高维图元
对来自主要的3-D创作工具的3-D内容,增强其外观并简化内容映射。
•高级技术
包含了用于输出Direct3D蒙皮网格的三维内容创建工具插件,使用了Direct3D多种不同技术,多分辨率层次细节(LOD)几何,还有高维表面数据。
•索引顶点混合
扩展了几何混合的支持,允许通过指定使用一个矩阵索引把矩阵应用于顶点混合处理。
•扩充了Direct3DX实用库
包含了大量的新函数。Direct3DX实用库是一个位于Direct3D之上的辅助层,用于简化3-D图形开发者的常规工作。它包括了一个蒙皮库,支持对网格的操作,还有组装顶点与像素着色器的功能。
DirectX每一次升级都会有重大的内核结构改变,它会给我们带来巨大的视觉冲击。DirectX7核心的T&L引擎到DirectX9干脆被抛弃了。因此对于图形芯片开发商、游戏开发商以及广大用户而言,DirectX 9的确是一项“绝无仅有的优越图形技术”。DirectX 9“具有多项令人兴奋的全新功能特征”:
Direct3D图形渲染管道
•Vertex Shader 2.0和Pixel Shader 2.0
在DirectX9中,Vertex Shader和Pixel Shader的版本升级到了2.0,它们都支持64或甚至128位浮点色彩精度。浮点色彩在动态和精度上的增加给图像质量带来质的飞跃,这样在DirectX9中你可以轻易实现电影级别般逼真的效果!
DirectX8和DirectX9的对比参数:
Vertex Shader 2.0引入了流程控制,增加了条件跳转、循环和子程序。Vertex程序现在最多可以由1024条指令组成(之前只能用128条指令),增加的指令带来更加复杂和强大的表现,新的操作如正弦、余弦及其他强大的函数运算大大简化了代码的编写,并且能够表现更加复杂的效果。
Vertex Shader 1.0 VertexShader 2.0
强大的可编程Pixel Shader是实现具有电影质量级别效果的真正精华所在。Pixel Shader 2.0可以支持高级程序语言和汇编语言,开发人员还可以将其汇编代码嵌入较高级的程序语言中。前一版的Pixel Shader语言被限制为只能使用最多6个材质和28条指令,而2.0版则将这一上限提升至最大16材质和160条指令,也新增了很多强化的运算和操作。
Pixel Shader 1.4
Pixel Shader 2.0
此外各种Shader工具的大力协助,如nVidia的Cg语言和ATI的RenderMonkey,使得实时图形渲染的质量飞速提高,nVidia和ATI官方的Demo就足以说明这一点。DirectX9中也改进了部分接口定义,Vertex Shader和Pixel Shader分别单独提供了一个接口,而且提供了常见图形的绘制接口,如线段的绘制等,这进一步减轻了开发人员的负担。
•浮点型色彩和32位帧缓冲格式
目前大多数色彩表示法(如RGB)用8位整数表示红、绿、蓝色,也许对于显示来说这已经足够了,但在运算中似乎还远不够。由于整数没有小数部分,因此当它们经过Pixel Shader极其复杂的数学运算后,就会产生较大的误差,这可能导致色彩明显失真。而DirectX9支持数种浮点色彩格式,使得其精度有了很大提高。同时DirectX9支持精确到每像素32位的帧缓冲格式,能够表现出4倍于目前亮度等级的数量,这使得图像看上去更加清晰和自然。
除此以外,DirectX9还提供位移贴图(displacement maps)以及改进的设备模拟等特性的支持,并且毫无意外地,DirectX9 SDK中也进一步扩展了Direct3DX实用库,提高了开发效率。
2、DirectSound、DirectMusic和DirectX Audio
在DirectX中DirectSound和DirectMusic可以统称DirectX Audio。一个好的游戏是不能没有声音的,DirectX Audio负责了游戏中的音效控制。不仅仅是游戏,很多需要高质量音效的地方都有它们的影子,我们经常在一些播放软件的设置面板中看见是否使用DirectSound支持的选项。
DirectX Audio做的不仅仅只是简单地对声音的回放。它提供了一个完整的系统,能够利用硬件加速的功能动态地操纵控制音轨和声道(soundtrack)。
如果你想在你的程序中使用DirectMusic和DirectSound,你就能够获得以下功能:
•读入且播放例如MIDI, WAVE, 以及DirectMusic Producer run time等格式的声音文件。
•同时对多个声音资源进行混音播放。
•对播放的声轨进行高精度时间控制。
•可以动态地变更播放节拍与节奏,甚至实时地动态控制一些MIDI事件。
•使用DLS合成器(DirectX Audio自带的波表合成器),你的程序就可以确保在不同的计算机上听到相同的MIDI声音。你的程序能够播放不受类别限制,各试各样乐器的声音,使用DirectX Audio,你甚至还能够创造出独一无二的乐器声音类别并将它发布。
•把声音做3D定位,创造出3D的环境声响。
•可以非常容易地实现例如变调、回响,以及别的声音特效。
•能使用数量超过16个的MIDI音轨。DirectX Audio突破了从前只能使用16个MIDI音轨的限制,它把同时回放大数量的音轨变成为了可能,而这个数量仅仅只是受到了你的声音硬件合成器能力的限制。
•播放位于不同的Audiopaths上的声音段(segments),效果就可以各自实现在每一段声音里。
•实现在不同的端口(port)之间捕捉MIDI数据及流("thru")。
•从话筒或者别的输入设备中捕捉声音数据。
如果使用DirectMusic Producer或类似程序中的源文件,你还能够做到
•在声音的回放期间能够做更多的控制,例如动态选择不同的音效变化器(variations)或切换不同的和旋级数。
•精确地定时重放音乐。
•利用变化器(variations)播放声音(wave)
•Audiopaths利用Map performance channels可以使相同的声音段在channel的不同部分产生完全不同的播放效果。
•动态地创造出全新的音乐片段,这不需要专门算法库,仅仅需要你的作曲能力而已。
•动态地将存在的音乐片段进行组合过渡。
•在声音回放时端,程序可以获得存在于特殊节拍点的各类声音特效的信息。
这些功能适用于常常只使用主音频流(mainstream)的程序。如果程序只要实现一些基本简单的功能,开发者将DirectX Audio设计得非常易用,很适合初学者。DirectX Audio也是可扩展的。好的程序可以利用虚函数(virtual)继承设计出新的类,例如:
•支持新的声音格式文件。
•音轨可以包含各类数据。
•处理信息的工具 - 比方说,可以截取记录实现变换,或者将要显示的歌词置入声音片段文件。
•自定义的音序器(sequencer)。
•自定义的合成器(synthesizer)。
•效果过滤器。(Effects filters)。
值得一提的是,在DirectX9中加入了DirectMP3和DirectCD两个功能模块,它们使得主流的音频播放也能够通过DirectX与其调用程序更好地结合在一起。
3、 DirectInput
在DirectX这个大家族中,DirectInput掌管着“行为控制权”。与Winodows事件响应相比,DirectInput可以直接访问硬件,直接从输入缓冲区内检索数据,从而获得比响应Windows消息更快的速度。此外DirectInput也对力反馈游戏杆(Force Feedback)提供了良好支持。
4、 DirectPlay
网络底层程序的开发向来是令开发者头痛的一件事,而DirectPlay似乎兼顾了速度与易用性两个方面,在网络游戏这样一类对速度和效率要求较高的软件来说,针对游戏优化设计的DirectPlay显然是一个比较好的选择。DirectPlay提供了一个额外的层,使你的游戏和网络底层相隔。并且,你的游戏可以非常简单地使用DirectPlay API,并使用DirectPlay管理网络通讯。DirectPlay提供的特性,使多人游戏在开发中得到了很多简化。其中包括:
• 创建和管理点对点、客户/服务会话(Session)
• 在一个会话中管理用户(User)和组(Group)
• 管理在不同网络平台上进行会话的成员之间发送的消息
• 使游戏在大厅(Lobby)中互动
• 使用户可以进行语音交互
5、 DirectShow
作为DirectX中的又一重要成员,DirectShow提供了Windows平台下高质量的媒体捕获和回放能力,支持很多格式:ASF、MPG、AVI、MP3和WAV。DirectShow支持使用WDM设备或老式视频设备进行视频捕获。当有硬件支持的环境下,它会在使用视频或音频时自动选择是否使用硬件加速。
DirectShow简化了媒体回放、格式转换和捕获任务。同时,当应用程序需要自定义底层流媒体解决方案时,它也提供直接流访问控制的功能。
你可以用DirectShow编写DVD播放器、视频编缉程序、AVI到 ASF转换器、MP3播放器和数字视频捕获程序等等。
三、.NET架构的挑战-----Managed DirectX
不知大家发现没有,安装了DirectX9 SDK后它的文档里似乎悄悄多了一个不小的板块,那就是Managed DirectX。那么这个神秘的家伙究竟是干什么的呢?
.NET Framework的发表打响了Microsoft .NET战略的第一枪,ASP.NET、Web Service等词也伴随着.NET 技术的普及几乎变得家喻户晓。大家已经知道DirectX是基于COM技术的,而COM技术主要是为本地机服务的,在本地机上DirectX可以尽量把硬件的性能发挥到极限,但是它在.NET的网络时代是不是就无法施展它原有的威力呢?答案肯定是“否”。现在,DirectX已经成为Windows核心API的一部分,而Microsoft表示不会再提供更多的Win32API,今后的Windows API可能将全部集成到.NET Framework中去,那么DirectX到哪里去了呢?原来它早就已经改头换面,与.NET Framework达成了“默契”,这也就是Managed DirectX的由来。
Managed DirectX 实质上是对DirectX进行了一个轻量级的封装,Microsoft在2003年10月初发布了Microsoft DirectX 9.0 SDK Update (Summer 2003),其中就着重改进了Managed DirectX部分。一方面使它能与.NET Framework紧密集成,可供.NET 平台下的其他语言调用 (如C#);另一方面对DirectX程序编写进行了进一步简化,使得DirectX向RAD开发的方向又迈进了一大步,毕竟ASP.NET、WinForm这些东西是在网络上运行的。如此我们可以试想将来可以在网页上看到有硬件加速支持的绚丽的3D动画实时演示,这将是多么令人激动的事啊!
四、开发环境的支持与配置
在进行DirectX开发之前,我们需要下载并安装相应版本的DirectX SDK,这个可以从Microsoft的官方站点上免费获得,最新的DirectX 9.0 SDK Update(Summer 2003)大约是185MB,相关的还有DirectX9 SDK for Pocket PC 、DirectX9 Meltdown、DirectX9 SDK Extras等,下载的相关页面http://msdn.microsoft.com/directx。
下载了相应的SDK后,我们就可以开始利用它进行DirectX开发了。
1、Microsoft Visual Studio 6.0/.NET/.NET 2003中的配置
因为DirectX是Microsoft的产品,所以在Visual Studio系列中,DirectX开发所需的配置显得格外简单,下面以最新的Microsoft Visual Studio .NET 2003为例说明。
第一步:配置Include和Library的目录,
设置包含文件(Include)
设置库文件(Lib)
第二步:添加链接所需的库文件
如下图所示菜单操作,添加相应的库文件,如dxguid.lib、d3d9.lib、d3dx9.lib等,不同的程序需要不同的库文件,但是dxguid.lib是必须要包含的。
其他办法:在设置了Include和Library文件路径后,我们还可以使用在程序首部加入以下语句变相实现相应库文件的链接。
#pragma comment (lib,"dxguid.lib")
#pragma comment (lib,"d3d9.lib")
........
2、Borland C++ Builder 5/6/X中的配置
很不幸,自DirectX8.0 SDK起,Microsoft就不再提供Borland编译器支持的库文件。Borland C++ Builder是一款非常优秀的RAD开发工具,它在开发桌面应用程序上的便捷性令人叹为观止,那么是不是就无法在C++ Builder中进行DirectX开发了呢?这似乎有点可惜。但是Borland自有它的高招,既然标准的DirectX SDK中不提供Borland版的库文件,那我就自己做!方法如下:
首先,在C++Builder安装目录下的bin子目录中,我们可以找到一个名为implib.exe的文件;其次,打开 MSDOS命令行窗口,输入:implib [库文件名] [源DLL文件名],即可成成相应链接所需的库文件。
例如:从d3d9.dll中导出编译所需的d3d9.lib,并将生成的d3d9.lib保存到C盘根目录下。
implib c:/d3d9.lib c:/windows/system32/d3d9.dll
这样我们就得到了所需的lib文件,然后将它和原来SDK中所提供的.h文件混合使用,就可以在C++ Builder中进行梦寐以求的DirectX开发了,此方法在C++ Builder X和DirectX9 SDK Update(Summer 2003)环境下测试通过。(在上述环境下似乎不需要dxguid.lib编译也能通过)
五、DirectX的未来
DirectX的基本模型架构:
DirectX9 DirectX10
在现有的DirectX 8和DirectX 9中,可编程顶点着色和像素渲染是分开来的两个单元,也就是说,GPU生产厂家需要在GPU中划分两个区域来存放Vertex Shader阵列和Pixel Shader贴图流水线,那么,能否把这两者整合在一起呢?可以!那就是DirectX 10!如图所示,预计DirectX10中的Vertex Shader和Pixel Shader将会合并成一个Integrated Shader单元。
五、结束语
正如本文所展现的历代DirectX的发展史,及其一步步改进的足迹,DirectX的确在媒体技术上占有至关重要的地位,它是一代又一代媒体技术发展的催化剂。可以预见,未来的DirectX将给我们带来前所未有的、更加震撼的视听冲击,让我们拭目以待!