第13章DirectX编程入门DirectX是微软公司为编写游戏和其他高性能多媒体应用程序而开发的一组高级的Windows低层API,它包含了对图(图形、视频和三维动画)、声音(声效与音乐)、输入设备和网络游戏等的支持。本章先概述DirectX的基本内容,然后介绍DirectX的主要组件Direct3D和DirectSound的基本编程方法,并给出若干具体编程实例。13.1DirectX概述本节简单介绍DurectX的发展历史、版本和功能的演化、结构和模块划分。DurectX是Windows的一种多媒体API,它在保持设备无关性的同时,可以让应用程序直接控制多媒体设备,从而能充分利用硬件的功能,因此可获得最高的性能。DurectX自从推出以来,就始终处在快速发展的过程之中。它已经经历了多个版本,其模块和功能也一直在不断地增加和完善。DirectX是一种基于COM的系统,主要由硬件抽象层HAL和硬件模拟层HEL所构成。DurectX被分成若干个组件模块,涵盖了多媒体应用的方方面面。而且这些组件的数目、名称和功能,也是随着其版本的演化而有所增减、改变和加强。13.1.1历史微软公司于1990年5月推出的Windows3.0大获成功,它是一种与设备无关的具有图形用户界面(GUI)的操作系统。后来又于1992年3月推出Windows3.1,提供了对多媒体的支持。不过Windows的与设备无关的设计思想,虽然使得Windows向程序员提供了一个独立于硬件的软件开发优秀平台,但它不让应用程序直接操作显卡和声卡等多媒体硬件,这样就降低了多媒体应用程序(特别是计算机游戏)的运行效率,例如限制了动画的帧率、不提供混音功能等。所以当时的Windows并不是一个可以开发和运行高效多媒体程序(如3D游戏)的理想环境,逼迫PC游戏开发商只好绕开Windows而仍旧开发DOS下的游戏。为了改变这种难堪的局面,促使游戏界放弃DOS而使用Windows,微软需要在设备无关性与高性能之间取得某种平衡,决定为Windows添加一种高性能的动画机制(以及后来的输入与音响等),因此于1995年推出了GameSDK,后来改名为DirectX。其中的Direct指可以直接访问多媒体硬件;X指它的不同组成部分,如Direct3D、DirectSound、DirectInput和DirectPlay等。多媒体技术与应用教程•2•13.1.2版本与功能因为DirectX必须支持多媒体设备的最新技术和功能,而多媒体硬件(尤其是显卡[的3D性能])和技术始终处在高速发展过程中,所以DirectX的技术和版本也同样在不断地发展和演变,其中发展最快的是3D接口部分。下面列出DirectX的主要版本的发布时间、引入的新模块和特性:1.0——1995年9月30日:DirectDraw、DirectSound、DirectInput、DirectPlay、DirectSetup;2.0——1996年6月5日:引入Direct3D(次版本有2.0a);3.0——1996年9月15日:支持MMX、为DirectSound补充DirectSound3DAPI(次版本有3.0a);4.0——无此版本号;5.0——1997年7月16日:有许多改进,如受力反馈控制器、多显示器支持、新的游戏控制面板、用户界面的全面改进等(次版本有5.1和5.2);6.0——1998年8月7日:添加新的3D特性(如添加DXUT框架)、支持AMD公司的3DNow!技术、性能较5.0有提高。在1999年2月3日推出的6.1版中,添加了DirectMusic模块;7.0——1999年9月22日:改进3D图形和声音、性能更快,为Direct3DAPI引入硬件传送、光照和纹理压缩、以及硬件加速,引入D3DX工具库。使用Creative公司的EAX技术改进3D声音的算法(次版本有7.0a和7.1);8.0——2000年9月30日:将DirectDraw与Direct3D完全集成在一起、其中Direct3D的性能有了本质上的飞跃(引入顶点/像素shader[着色引擎/光照模型]、支持硬件点精灵和三维体纹理),将DirectMusic与DirectSound更紧密地集成在一起构成DirectXAudio,更新了DirectInput与DirectPlay,添加了DirectShow、抛弃了其余的DirectXMedia模块。2001年11月11日推出的8.1版,被集成在WindowsXP中销售,该版本添加了从DirectShow分离出的DMO(DirectXMediaObjects媒体对象)组件模块。它还支持许多新的图形特性,如像素着色引擎的1.2~1.4版、动态/高分辨率纹理、新3D扩展方法等(次版本有8.0a、8.1、8.1a和8.1b);9.0——2002年12月24日:添加许多新特性到DirectXGraphics和DirectShow中,例如将DirectDraw的功能并入到Direct3D之中,支持顶点和像素着色引擎的新版本2.0和3.0,引入裁剪测试、位移贴图和多元纹理,支持128位浮点着色精度和根据显示器自动调整γ值等。也添加若干新特性到DirectInput、DirectPlay、DirectSound和DirectMusic中。(次版本有9.0a、9.0b和9.0c)。DirectX的最后一个以数字和字母命名的版本是2004年8月9日推出的9.0c,后来又于2004年10月、2005年的2/4/6/8/10月分别推出了它的多个升级版。从2005年12月推出的DirectX开始,其版本的命名发生了变化:主版本号改为DX,次版本改为发布的年月。一般是每两个月推出一个新版本,因此也叫做DirectX9.0c的双月更新(bimonthlyupdates)。当前最新版本为2006年10月11日推出的DXOctober2006。它们都包含了(于2002年推出的专为.NET框架设计的)托管(Managed)DirectX,将原来DirectX第13章DirectX编程入门•3•多个分离的COM模块集成到了一个容易使用的单一CLR文件之中。10——?:DirectX不会有第10版了,因为微软公司已将DirectX的功能集成进其新一代操作系统WindowsVista中,而不再将其作为一个额外的模块了。但是会有Direct3D10,已于2006年12月13日随Direct3DSDK的December2006版一起发布,并被嵌入到WindowsVista中。另外,作为学生和业余爱好者的DirectX替代产品,微软公司于2004年3月24日宣布了用于托管运行环境下计算机游戏的设计、开发和管理的框架和工具集XNA,并于2006年12月11日推出了XNAFrameworkRedistributable和XNAGameStudioExpress的1.0版,可用于Windows和Xbox360游戏的开发。13.1.3结构DirectX是一种基于COM(ComponentObjectModel,组件对象模型)的系统,它既不属于驱动程序层,也不属于应用层。DirectX的主要设计目标是在提供某种设备独立性的同时获取高速度,为此微软公司为DirectX设计了如图13-1所示的体系结构。其中:HAL=HardwareAbstractLayer(硬件抽象层)——负责检测本机的硬件功能,并以一种独立于设备的方式提供这些功能;HEL=HardwareEmulationLayer(硬件模拟层)——负责提供DirectX功能中本机硬件不支持部分的模拟实现。但是从8.0版起,DirectX就不再提供硬件模拟层HEL了,需要开发商、第三方或自己来编写一个PSD(PluggableSoftwareDevice可插式软件设备)连到DirectX提供的HEL接口上,称之为参考设备。但是现在很少有这样的PSD可用,因此新版本的DirectX是严重依赖于硬件的。13.1.4组成DirectX由多个(COM组件)模块组成,而且随着版本的演化,这些模块也在不断地增减、合并和改变。最新的DirectX组件的模块构成如图13-2所示,括号中的数字为该模块被首次引进(或移出)的版本号。下面是DirectX的主要组成模块的简单介绍:DirectXGraphics(图形)——包括DirectDraw和Direct3D:DirectDraw(绘制)——二维图形绘制(高速位图传送/视频与2D动画)。从9.0版起,DirectDraw已被集成到了Direct3D之中。Direct3D(三维)——三维图形绘制。分成保留(retained)和立即(immediate)两种模式(mode):保留模式是一种高层API,建立在立即模式之上,使用WindowsAPI应用程序WindowsAPI子系统(GDI、MMAPI、MCI、...)Windows驱动程序接口DirectXHELHALPC硬件子系统DirectX图13-1DirectX子系统多媒体技术与应用教程•4•起来方便容易,但是效率不高,适合于初学者;立即模式则是一种底层API,使用复杂,但是其效率比保留模式高得多。大多数DirectX应用程序,特别是计算机游戏,都是采用立即模式进行开发。自从6.0版以来,保留模式API的发展停滞不前,而立即模式API的发展却日新月异。不论是保留模式还是立即模式,Direct3D都是建立在DirectDraw之上的。从9.0版起,Direct3D包含了DirectDraw,它像OpenGL一样也具有二维图形绘制的功能。Direct3D的下一个版本为Durect3D10,为WindowsVista的一个有机组成部分。D3DX(Direct3D扩展)——为Direct3D服务的实用工具库,执行公共的数学计算和一些复杂的任务,包含若干简化3D模型使用的类,如粒子系统(particlesystem)。D3DX由动态链接库(DLL)提供。DXUT(编程框架)——建立在Direct3DAPI之上的样例框架,也叫通用文件框架,可以帮助程序员减少在繁琐的平凡工作(如创建窗口、创建设备、处理Windows消息和设备事件等)上所花的时间。图13-2DirectX的组成模块DirectXAudio(音频)——包括DirectSound和DirectMusic:DirectSound(声音)——主要针对波形音频,底层接口。可用于开发播放和捕捉波形音频的高性能立体与三维(DirectSound3D)音频应用程序。在下一代DirectX中,DirectSound的功能将由XACT(MicrosoftCross-PlatformAudioCreationTool微软跨平台音频生成工具)来代替。DirectMusic(音乐)——主要针对MIDI音乐,高层接口。为基于波形、DirectXDirectXGraphics(8.0)DirectDraw(1.0)Direct3D(2.0)DirectXAudio(8.0)DirectSound(1.0)DirectMusic(6.1)DirectSound3D(3.0)DirectInput(1.0)DirectPlay(1.0)DirectSetup(1.0)DirectXMedia(5.0)DirectShow(5.0)DirectAnimation(5.0)DirectX视频加速(5.0)Direct3D保留模式(5.0)DirectXTransform(5.0)并入(9.0)移入平台SDK(9.0c2005.4)建议用WinSocket和WinFirewallAPI代替(9.0c)并入(8.0)移入WindowsMediaSDK(8.0)XInput(9.0c2005.10)XboxLive(Vista)MediaFoundation(Vista)XACT(9.0c2006.2)XNA(Xbox/Vista)DirectXMediaObject