1、X指它的不同组成部分,如Direct3D、DirectSound、DirectInput和DirectPlay等。13.1.2 版本与功能因为DirectX必须支持多媒体设备的最新技术和功能,而多媒体硬件(尤其是显卡的3D性能)和技术始终处在高速发展过程中,所以DirectX的技术和版本也同样在不断地发展和演变,其中发展最快的是3D接口部分。下面列出DirectX的主要版本的发布时间、引入的新模块和特性: 1.01995年9月30日:DirectDraw、DirectSound、DirectInput、DirectPlay、DirectSetup; 2.01996年6月5日:引入Direct3
2、D(次版本有2.0a); 3.01996年9月15日:支持MMX、为DirectSound 补充DirectSound3D API(次版本有3.0a); 4.0无此版本号; 5.01997年7月16日:有许多改进,如受力反馈控制器、多显示器支持、新的游戏控制面板、用户界面的全面改进等(次版本有5.1和5.2); 6.01998年8月7日:添加新的3D特性(如添加DXUT框架)、支持AMD公司的3DNow!技术、性能较5.0有提高。在1999年2月3日推出的6.1版中,添加了DirectMusic模块; 7.01999年9月22日:改进3D图形和声音、性能更快,为Direct3D API引入硬件
3、传送、光照和纹理压缩、以及硬件加速,引入D3DX工具库。使用Creative公司的EAX技术改进3D声音的算法(次版本有7.0a和7.1); 8.02000年9月30日:将DirectDraw与Direct3D完全集成在一起、其中Direct3D的性能有了本质上的飞跃(引入顶点/像素shader着色引擎/光照模型、支持硬件点精灵和三维体纹理),将DirectMusic与 DirectSound更紧密地集成在一起构成DirectX Audio,更新了DirectInput与DirectPlay,添加了DirectShow、抛弃了其余的DirectX Media模块。2001年11月11日推出的8
4、.1版,被集成在Windows XP中销售,该版本添加了从DirectShow分离出的DMO(DirectX Media Objects媒体对象)组件模块。它还支持许多新的图形特性,如像素着色引擎的1.21.4版、动态/高分辨率纹理、新3D扩展方法等(次版本有8.0a、8.1、8.1a和8.1b); 9.02002年12月24日:添加许多新特性到DirectX Graphics和DirectShow中,例如将DirectDraw的功能并入到Direct3D之中,支持顶点和像素着色引擎的新版本2.0和3.0,引入裁剪测试、位移贴图和多元纹理,支持128位浮点着色精度和根据显示器自动调整值等。也添
5、加若干新特性到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,次版本改为发布的年月。一般是每两个月推出一个新版本,因此也叫做DirectX 9.0c的双月更新(bimonthly updates)。当前最新版本为2006年10月11日推出的DX Octob
6、er 2006。它们都包含了(于2002年推出的专为.NET框架设计的)托管(Managed)DirectX,将原来DirectX多个分离的COM模块集成到了一个容易使用的单一CLR文件之中。 10?:DirectX不会有第10版了,因为微软公司已将DirectX的功能集成进其新一代操作系统Windows Vista中,而不再将其作为一个额外的模块了。但是会有Direct3D 10,已于2006年12月13日随Direct3D SDK的December 2006版一起发布,并被嵌入到Windows Vista中。另外,作为学生和业余爱好者的DirectX替代产品,微软公司于2004年3月24日
7、宣布了用于托管运行环境下计算机游戏的设计、开发和管理的框架和工具集XNA,并于2006年12月11日推出了XNA Framework Redistributable 和XNA Game Studio Express的1.0版,可用于Windows和Xbox 360游戏的开发。13.1.3 结构图13-1 DirectX子系统DirectX是一种基于COM(Component Object Model,组件对象模型)的系统,它既不属于驱动程序层,也不属于应用层。DirectX的主要设计目标是在提供某种设备独立性的同时获取高速度,为此微软公司为DirectX设计了如图13-1所示的体系结构。其中:
8、 HAL = Hardware Abstract Layer(硬件抽象层)负责检测本机的硬件功能,并以一种独立于设备的方式提供这些功能; HEL = Hardware Emulation Layer(硬件模拟层)负责提供DirectX功能中本机硬件不支持部分的模拟实现。但是从8.0版起,DirectX就不再提供硬件模拟层HEL了,需要开发商、第三方或自己来编写一个PSD(Pluggable Software Device可插式软件设备)连到DirectX提供的HEL接口上,称之为参考设备。但是现在很少有这样的PSD可用,因此新版本的DirectX是严重依赖于硬件的。13.1.4 组成Direc
9、tX由多个(COM组件)模块组成,而且随着版本的演化,这些模块也在不断地增减、合并和改变。最新的DirectX组件的模块构成如图13-2所示,括号中的数字为该模块被首次引进(或移出)的版本号。下面是DirectX的主要组成模块的简单介绍: DirectX Graphics(图形) 包括DirectDraw和Direct3D: DirectDraw(绘制) 二维图形绘制(高速位图传送/视频与2D动画)。从9.0版起,DirectDraw已被集成到了Direct3D之中。 Direct3D(三维) 三维图形绘制。分成保留(retained)和立即(immediate)两种模式(mode):保留模式
10、是一种高层API,建立在立即模式之上,使用起来方便容易,但是效率不高,适合于初学者;立即模式则是一种底层API,使用复杂,但是其效率比保留模式高得多。大多数DirectX应用程序,特别是计算机游戏,都是采用立即模式进行开发。自从6.0版以来,保留模式API的发展停滞不前,而立即模式API的发展却日新月异。不论是保留模式还是立即模式,Direct3D都是建立在DirectDraw之上的。从9.0版起,Direct3D包含了DirectDraw,它像OpenGL一样也具有二维图形绘制的功能。Direct3D的下一个版本为Durect3D 10,为Windows Vista的一个有机组成部分。 D3
11、DX(Direct3D扩展) 为Direct3D服务的实用工具库,执行公共的数学计算和一些复杂的任务,包含若干简化3D模型使用的类,如粒子系统(particle system)。D3DX由动态链接库(DLL)提供。 DXUT(编程框架) 建立在Direct3D API之上的样例框架,也叫通用文件框架,可以帮助程序员减少在繁琐的平凡工作(如创建窗口、创建设备、处理Windows消息和设备事件等)上所花的时间。图13-2 DirectX的组成模块 DirectX Audio(音频)包括DirectSound和DirectMusic: DirectSound(声音) 主要针对波形音频,底层接口。可用
12、于开发播放和捕捉波形音频的高性能立体与三维(DirectSound 3D)音频应用程序。在下一代DirectX中,DirectSound的功能将由XACT(Microsoft Cross-Platform Audio Creation Tool微软跨平台音频生成工具)来代替。 DirectMusic(音乐) 主要针对MIDI音乐,高层接口。为基于波形、MIDI声音或DirectMusic生成器所创造的动态内容之音乐和非音乐声道提供一个完整的解决方案。 XACT(游戏音频) XACT(Microsoft Cross-Platform Audio Creation Tool,微软跨平台音频生成工具
13、),是一种多人合作的音频设计工具和相关API,用于游戏的动态音频开发。 DirectInput(输入) 提供对各种输入设备的支持,包括对受力反馈(force-feedback)技术的全面支持。在下一代DirectX中,DirectInput将被XInput代替。 DirectPlay(游戏) 提供对多人网络游戏的支持。在最新的DirectX版本中,微软公司反对(deprecate)使用DirectPlay,而建议改用Windows Sockets和Windows Firewall API来代替。在下一代DirectX中,DirectPlay可能会被Xbox Live代替。 DirectSetu
14、p(安装) 提供DirectX组件的一次性调用安装的一个简单API(自动安装DirectX驱动程序)。 DirectShow(展示) 提供多媒体(音视频)流的高质量捕捉和重放。在8.0版之前,DirectShow是DirectX Media的一个组成模块。到8.0版时,因为DirectX SDK抛弃了DirectX Media,所以才将DirectShow集成到了DirectX之中。在DirectX 9.0c的2005年4月升级版中,DirectShow又被移出DirectX,放入微软公司的平台SDK之中。 DirectX Media Objects(媒体对象DMO) 基于COM的多媒体和数据
15、流组件,支持音视频的编解码器和特效。是在DirectX的8.1版时,从DirectShow分出的,其功能类似于DirectShow的过滤器。 DirectX Media(媒体) 是一个用于流媒体应用的外部API集合。在DirectX 6.0之前,DirectX Media SDK和DirectX SDK是两个分离的SDK。在6.0版时DirectX Media SDK被集成到DirectX SDK之中。DirectX Media的运行模块,被集成到Windows和IE之中。到了8.0版时,DirectX Media又被DirectX SDK抛弃(其核心模块DirectShow被集成到了Dire
16、ctX之中),其功能被随Windows 2000 Server推出的Windows Media SDK所代替。 DirectX Transform(变换) 用于产生二、三维图形的各种效果,如混色和表面弯曲等。 DirectAnimation(动画) 集成多种媒体类型来创建复杂动画,并可用作网页内容。 DirectX Video Acceleration(视频加速DXVA) 利用硬件加速二维视频的解码操作。 Direct3D Retained Mode(保留模式) Direct3D的保留模式是一种高层API,建立在Direct3D立即模式之上,使用起来方便容易,但是效率不高,适合于初学者。 Di
17、rectShow(展示) 支持音视频流的高质量采集和重放。13.1.5 编程准备为了用VC编写DirectX应用程序,必须先下载并安装DirectX SDK,并进行必要的头/库文件路径和链接库的设置。下面以Windows XP中文版环境下的Visual C+ 2005中文版和DirectX 9.0c August 2006 SDK为例,介绍进行具体的DirectX编程之前,所需做的必要准备工作。 下载并安装DirectX SDK可以从微软公司的官方网站()下载最新的DirectX SDK,如dxsdk_dec2006.exe(448MB)。安装完成后,会在安装目录(缺省为“C:Program
18、FilesMicrosoft DirectX SDK (December 2006)”)中生成Developer Runtime、Documentation、Include、Lib、Redist、Samples和Utilities等多个子目录。安装时还会为Windows操作系统生成名为“Microsoft DirectX SDK (December 2006)”的程序组,包含多个子程序组和程序。安装程序会将DirectX SDK的帮助文档,也安装到Visual Studio 2005的帮助系统内,位于其“目录/DirectX SDK (December 2006)”目录之中,包含“Direct
19、X SDK (December 2006) C+”和“DirectX SDK (December 2006) Managed”两个帮助子目录。 设置包含和库路径在Visual Studio 2005中文版的IDE中,选“工具/选项”菜单项,打开“选项”对话框(参见图13-5)。图13-5 Visual Studio 2005的“选项”对话框再选该对话框左边的“项目和解决方案/VC+目录”路径,在右边的“显示以下内容的目录”栏的下拉式列表框中,选“包含文件”项。按该栏下面的“新行”钮,则在其下方的显示栏中会出现新行,再按新行右端的带省略号的浏览钮,在弹出的“选择目录”对话框中,选择DirectX
20、 SDK的Include目录所在的路径“C:Program FilesMicrosoft DirectX SDK (August 2006)Include”,然后按“打开”关闭“选择目录”对话框。结果参见图13-6。图13-6 设置DirectX的“包含文件”的路径可类似选择“库文件”项,添加库文件路径“C:Program FilesMicrosoft DirectX SDK (August 2006)Libx86”,结果参见图13-7。最后,按“确定”钮,关闭“选项”对话框。图13-7 设置DirectX的“库文件”的路径注意,对DirectX的包含路径和库路径的设置,对所有项目都有效。 设
21、置链接库先创建一个DirectX应用程序的MFC单文档项目(如DxTest),再在VS05的IDE中,选“项目/属性”,打开“DxTest属性页”对话框。在左上角的“配置”栏中,选中“所有配置”项;再选左边的路径“配置属性/链接器/输入”,在右边的“附加依赖项”栏中,添加d3d9.lib d3dx9.lib d3dxof.lib dsound.lib dxguid.lib winmm.lib等链接库(在多个库文件之间,用空格分隔)。具体添加哪些DirectX库,与具体应用程序所使用的DirectX模块有关,你也可以查看DirectX的库目录。最后,按“应用”钮和“确定”钮,关闭属性页对话框。参
22、见图13-8。图13-8 设置DirectX的链接库注意,对DirectX链接库的设置,只对VC05中当前打开的单个项目有效。在安装了DirectX SDK,并设置好文件路径和链接库后,就可以开始编写具体的DirectX应用程序了。DirectX的组件众多、功能强大、编程复杂,完整的介绍需要几本大部头的专著才行,本书只准备简单介绍DirectX的最主要模块Direct3D和DirectSound编程的最基本内容。13.2 Direct3D编程简介Direct3D(直接三维)是DirectX的核心模块,新版本的Direct3D中还包含原来DirectDraw模块的2D功能。因此,现在的Direc
23、t3D是DirectX Graphics的唯一模块,具有DirectX(二、三维)图形的全部功能。13.2.1 流水线与设备Direct3D用图形流水线(graphics pipeline)来处理和渲染场景(render scene),而Direct3D设备(device)是执行变换(transformation)和光照(lighting)等操作的渲染部件。 Direct3D图形流水线可通过Direct3D图形流水线来充分利用硬件性能,以提供高效处理和绘制Direct3D场景到显示器的能力。图13-9为流水线(pipeline,管线/管道/流程)的组成模块框图。图13-9 Direct3D图形
24、流水线 Direct3D设备Direct3D设备(device)是Direct3D的渲染部件,它封装和存储渲染状态。另外,它还执行变换和光照等操作,并且光栅化图像到表面(如屏幕)。在结构上,Direct3D设备包含变换模块(transformation module)、光照模块(lighting module)和光栅化器(rasterizer)。图13-10为Direct3D的设备架构(architecture)。当前,Direct3D有两种主要的设备类型: HAL设备(hal device) 具有硬件加速的光栅化(rasterization),可同时使用硬件和软件的顶点处理进行着色(shad
25、ing)。 参考设备(reference device) 由软件驱动程序提供,现在主要用于性能测试。具有软件特性的参考设备不一定能提供与硬件等同的性能,因此应用程序必须总是查询设备的能力以确定其支持哪些特性。13.2.2 基本编程过程Direct3D的基本编程过程如图13-11所示。下面各小节依次介绍Direct3D编程的基本步骤和方法。13.2.3 创建和初始化对象为了使用Direct3D,你必须首先创建一个应用窗口,然后再创建和初始化Direct3D对象。利用这些对象所实现的COM接口来操作它们,以创建绘制场景所需的其它对象。如果进行MFC编程,则可以省略创建窗口这一步,而直接使用视图类所
26、代表的客户区窗口。图13-11 Direct3D编程的基本过程下面介绍的是初始化Direct3D的内容,包括创建Direct3D对象、创建Direct3D设备和设置Direct3D设备的渲染(render着色)状态等。 创建Direct3D对象可使用全局函数Direct3DCreate9来创建Direct3D接口对象:IDirect3D9 * Direct3DCreate9( / 成功返回指向IDirect3D9接口的指针,失败返回NULL UINT SDKVersion / 必须为D3D_SDK_VERSION);例如:IDirect3D9 * g_pD3D = Direct3DCreate
27、9( D3D_SDK_VERSION ); 创建Direct3D设备可使用IDirect3D9接口的CreateDevice方法来创建设备(尾参数的返回值):HRESULT CreateDevice( / 成功返回D3D_OK(= 0) UINT Adapter, / 显卡(display adapter)序号,D3DADAPTER_DEFAULT为主显卡 D3DDEVTYPE DeviceType, / 设备的枚举类型,一般取为D3DDEVTYPE_HAL HWND hFocusWindow, / 焦点窗口句柄,可取为this-m_hWnd DWORD BehaviorFlags, / 控制
28、设备的创建行为之选项组合,可以采用硬件或软件/ 的顶点处理,如D3DCREATE_SOFTWARE_VERTEXPROCESSING D3DPRESENT_PARAMETERS * pPresentationParameters, / 指向展现参数结构/ D3DPRESENT_PARAMETERS的指针 IDirect3DDevice9 * ppReturnedDeviceInterface / 代表被创建设备的/ IDirect3DDevice9返回接口的指针地址其中,展现参数结构D3DPRESENT_PARAMETERS的定义为:typedef struct D3DPRESENT_PARAMETERS / 展现参数结构UINT BackBufferWidth, BackBufferHeight; / 后台缓冲区的宽高(以像素为单位),/ 对窗口模式可取为0,对全屏模式则必须与当前显卡枚举模式的一致D3DFORMAT BackBufferFormat; / 后台缓冲区的格式,可取为/ D3DFMT_UNKNOWN(= 0) UINT BackBufferCount; / 后台缓冲区计数,可取为03,取0时
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1