多媒体技术13directx编程入门doc.docx
- 文档编号:25540091
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:85
- 大小:724.56KB
多媒体技术13directx编程入门doc.docx
《多媒体技术13directx编程入门doc.docx》由会员分享,可在线阅读,更多相关《多媒体技术13directx编程入门doc.docx(85页珍藏版)》请在冰豆网上搜索。
多媒体技术13directx编程入门doc
第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等。
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多个分离的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,建立在立即模式之上,使用起来方便容易,但是效率不高,适合于初学者;立即模式则是一种底层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音乐,高层接口。
为基于波形、MIDI声音或DirectMusic生成器所创造的动态内容之音乐和非音乐声道提供一个完整的解决方案。
◆XACT(游戏音频)——XACT(MicrosoftCross-PlatformAudioCreationTool,微软跨平台音频生成工具),是一种多人合作的音频设计工具和相关API,用于游戏的动态音频开发。
⏹DirectInput(输入)——提供对各种输入设备的支持,包括对受力反馈(force-feedback)技术的全面支持。
在下一代DirectX中,DirectInput将被XInput代替。
⏹DirectPlay(游戏)——提供对多人网络游戏的支持。
在最新的DirectX版本中,微软公司反对(deprecate)使用DirectPlay,而建议改用WindowsSockets和WindowsFirewallAPI来代替。
在下一代DirectX中,DirectPlay可能会被XboxLive代替。
⏹DirectSetup(安装)——提供DirectX组件的一次性调用安装的一个简单API(自动安装DirectX驱动程序)。
⏹DirectShow(展示)——提供多媒体(音视频)流的高质量捕捉和重放。
在8.0版之前,DirectShow是DirectXMedia的一个组成模块。
到8.0版时,因为DirectXSDK抛弃了DirectXMedia,所以才将DirectShow集成到了DirectX之中。
在DirectX9.0c的2005年4月升级版中,DirectShow又被移出DirectX,放入微软公司的平台SDK之中。
⏹DirectXMediaObjects(媒体对象DMO)——基于COM的多媒体和数据流组件,支持音视频的编解码器和特效。
是在DirectX的8.1版时,从DirectShow分出的,其功能类似于DirectShow的过滤器。
⏹DirectXMedia(媒体)——是一个用于流媒体应用的外部API集合。
在DirectX6.0之前,DirectXMediaSDK和DirectXSDK是两个分离的SDK。
在6.0版时DirectXMediaSDK被集成到DirectXSDK之中。
DirectXMedia的运行模块,被集成到Windows和IE之中。
到了8.0版时,DirectXMedia又被DirectXSDK抛弃(其核心模块DirectShow被集成到了DirectX之中),其功能被随Windows2000Server推出的WindowsMediaSDK所代替。
◆DirectXTransform(变换)——用于产生二、三维图形的各种效果,如α混色和表面弯曲等。
◆DirectAnimation(动画)——集成多种媒体类型来创建复杂动画,并可用作网页内容。
◆DirectXVideoAcceleration(视频加速DXVA)——利用硬件加速二维视频的解码操作。
◆Direct3DRetainedMode(保留模式)——Direct3D的保留模式是一种高层API,建立在Direct3D立即模式之上,使用起来方便容易,但是效率不高,适合于初学者。
◆DirectShow(展示)——支持音视频流的高质量采集和重放。
13.1.5编程准备
为了用VC编写DirectX应用程序,必须先下载并安装DirectXSDK,并进行必要的头/库文件路径和链接库的设置。
下面以WindowsXP中文版环境下的VisualC++2005中文版和DirectX9.0cAugust2006SDK为例,介绍进行具体的DirectX编程之前,所需做的必要准备工作。
●下载并安装DirectXSDK
可以从微软公司的官方网站(SDK,如dxsdk_dec2006.exe(448MB)。
安装完成后,会在安装目录(缺省为“C:
\ProgramFiles\MicrosoftDirectXSDK((December2006)”)中生成DeveloperRuntime、Documentation、Include、Lib、Redist、Samples和Utilities等多个子目录。
安装时还会为Windows操作系统生成名为“MicrosoftDirectXSDK((December2006)”的程序组,包含多个子程序组和程序。
安装程序会将DirectXSDK的帮助文档,也安装到VisualStudio2005的帮助系统内,位于其“目录/DirectXSDK((December2006)”目录之中,包含“DirectXSDK((December2006)C++”和“DirectXSDK((December2006)Managed”两个帮助子目录。
●设置包含和库路径
在VisualStudio2005中文版的IDE中,选“工具/选项”菜单项,打开“选项”对话框(参见图13-5)。
图13-5VisualStudio2005的“选项”对话框
再选该对话框左边的“项目和解决方案/VC++目录”路径,在右边的“显示以下内容的目录”栏的下拉式列表框中,选“包含文件”项。
按该栏下面的“新行”钮
,则在其下方的显示栏中会出现新行,再按新行右端的带省略号的浏览钮
,在弹出的“选择目录”对话框中,选择DirectXSDK的Include目录所在的路径“C:
\ProgramFiles\MicrosoftDirectXSDK(August2006)\Include”,然后按“打开”关闭“选择目录”对话框。
结果参见图13-6。
图13-6设置DirectX的“包含文件”的路径
可类似选择“库文件”项,添加库文件路径“C:
\ProgramFiles\MicrosoftDirectXSDK(August2006)\Lib\x86”,结果参见图13-7。
最后,按“确定”钮,关闭“选项”对话框。
图13-7设置DirectX的“库文件”的路径
注意,对DirectX的包含路径和库路径的设置,对所有项目都有效。
●设置链接库
先创建一个DirectX应用程序的MFC单文档项目(如DxTest),再在VS05的IDE中,选“项目/属性”,打开“DxTest属性页”对话框。
在左上角的“配置”栏中,选中“所有配置”项;再选左边的路径“配置属性/链接器/输入”,在右边的“附加依赖项”栏中,添加d3d9.libd3dx9.libd3dxof.libdsound.libdxguid.libwinmm.lib等链接库(在多个库文件之间,用空格分隔)。
具体添加哪些DirectX库,与具体应用程序所使用的DirectX模块有关,你也可以查看DirectX的库目录。
最后,按“应用”钮和“确定”钮,关闭属性页对话框。
参见图13-8。
图13-8设置DirectX的链接库
注意,对DirectX链接库的设置,只对VC05中当前打开的单个项目有效。
在安装了DirectXSDK,并设置好文件路径和链接库后,就可以开始编写具体的DirectX应用程序了。
DirectX的组件众多、功能强大、编程复杂,完整的介绍需要几本大部头的专著才行,本书只准备简单介绍DirectX的最主要模块——Direct3D和DirectSound编程的最基本内容。
13.2Direct3D编程简介
Direct3D(直接三维)是DirectX的核心模块,新版本的Direct3D中还包含原来DirectDraw模块的2D功能。
因此,现在的Direct3D是DirectXGraphics的唯一模块,具有DirectX(二、三维)图形的全部功能。
13.2.1流水线与设备
Direct3D用图形流水线(graphicspipeline)来处理和渲染场景(renderscene),而Direct3D设备(device)是执行变换(transformation)和光照(lighting)等操作的渲染部件。
●Direct3D图形流水线
可通过Direct3D图形流水线来充分利用硬件性能,以提供高效处理和绘制Direct3D场景到显示器的能力。
图13-9为流水线(pipeline,管线/管道/流程)的组成模块框图。
图13-9Direct3D图形流水线
●Direct3D设备
Direct3D设备(device)是Direct3D的渲染部件,它封装和存储渲染状态。
另外,它还执行变换和光照等操作,并且光栅化图像到表面(如屏幕)。
在结构上,Direct3D设备包含变换模块(transformationmodule)、光照模块(lightingmodule)和光栅化器(rasterizer)。
图13-10为Direct3D的设备架构(architecture)。
当前,Direct3D有两种主要的设备类型:
⏹HAL设备(haldevice)——具有硬件加速的光栅化(rasterization),可同时使用硬件和软件的顶点处理进行着色(shading)。
⏹参考设备(referencedevice)——由软件驱动程序提供,现在主要用于性能测试。
具有软件特性的参考设备不一定能提供与硬件等同的性能,因此应用程序必须总是查询设备的能力以确定其支持哪些特性。
13.2.2基本编程过程
Direct3D的基本编程过程如图13-11所示。
下面各小节依次介绍Direct3D编程的基本步骤和方法。
13.2.3创建和初始化对象
为了使用Direct3D,你必须首先创建一个应用窗口,然后再创建和初始化Direct3D对象。
利用这些对象所实现的COM接口来操作它们,以创建绘制场景所需的其它对象。
如果进行MFC编程,则可以省略创建窗口这一步,而直接使用视图类所代表的客户区窗口。
图13-11Direct3D编程的基本过程
下面介绍的是初始化Direct3D的内容,包括创建Direct3D对象、创建Direct3D设备和设置Direct3D设备的渲染(render着色)状态等。
●创建Direct3D对象
可使用全局函数Direct3DCreate9来创建Direct3D接口对象:
IDirect3D9*Direct3DCreate9(//成功返回指向IDirect3D9接口的指针,失败返回NULL
UINTSDKVersion//必须为D3D_SDK_VERSION
);
例如:
IDirect3D9*g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
●创建Direct3D设备
可使用IDirect3D9接口的CreateDevice方法来创建设备(尾参数的返回值):
HRESULTCreateDevice(//成功返回D3D_OK(=0)
UINTAdapter,//显卡(displayadapter)序号,D3DADAPTER_DEFAULT为主显卡
D3DDEVTYPEDeviceType,//设备的枚举类型,一般取为D3DDEVTYPE_HAL
HWNDhFocusWindow,//焦点窗口句柄,可取为this->m_hWnd
DWORDBehaviorFlags,//控制设备的创建行为之选项组合,可以采用硬件或软件
//的顶点处理,如D3DCREATE_SOFTWARE_VERTEXPROCESSING
D3DPRESENT_PARAMETERS*pPresentationParameters,//指向展现参数结构
//D3DPRESENT_PARAMETERS的指针
IDirect3DDevice9**ppReturnedDeviceInterface//代表被创建设备的
//IDirect3DDevice9返回接口的指针地址
);
其中,展现参数结构D3DPRESENT_PARAMETERS的定义为:
typedefstructD3DPRESENT_PARAMETERS{//展现参数结构
UINTBackBufferWidth,BackBufferHeight;//后台缓冲区的宽高(以像素为单位),
//对窗口模式可取为0,对全屏模式则必须与当前显卡枚举模式的一致
D3DFORMATBackBufferFormat;//后台缓冲区的格式,可取为
//D3DFMT_UNKNOWN(=0)
UINTBackBufferCoun
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多媒体技术 13 directx 编程 入门 doc