DirectX编程简介

 

DirectX是微软公司为编写游戏和其他高性能多媒体应用程序而开发的一组高级的Windows低层API,它包含了对图(图形、视频和三维动画)、声音(声效与音乐)、输入设备和网络游戏等的支持。

本章先概述DirectX的基本内容,然后介绍DirectX的主要组件Direct3D和DirectSound的基本编程方法,并给出若干具体编程实例。

14.1  DirectX概述

本节简单介绍DirectX的发展历史、版本和功能的演化、结构和模块划分。

DirectX是Windows的一种多媒体API,它在保持设备无关性的同时,可以让应用程序直接控制多媒体设备,从而能充分利用硬件的功能,因此可获得最高的性能。

DirectX自从推出以来,就始终处在快速发展的过程之中。它已经经历了多个版本,其模块和功能也一直在不断地增加和完善。

DirectX是一种基于COM的系统,主要由硬件抽象层HAL和硬件模拟层HEL所构成。DirectX被分成若干个组件模块,涵盖了多媒体应用的方方面面。而且这些组件的数目、名称和功能,也是随着其版本的演化而有所增减、改变和加强。

14.1.1  历史

微软公司于1990年5月推出的Windows 3.0大获成功,它是一种与设备无关的具有图形用户界面(GUI)的操作系统。后来又于1992年3月推出Windows 3.1,提供了对多媒体的支持。不过Windows的与设备无关的设计思想,虽然使得Windows向程序员提供了一个独立于硬件的软件开发优秀平台,但它不让应用程序直接操作显卡和声卡等多媒体硬件,这样就降低了多媒体应用程序(特别是计算机游戏)的运行效率(如限制了动画的帧率、不提供混音功能等)。所以当时的Windows并不是一个可以开发和运行高效多媒体程序(如3D游戏)的理想环境,逼迫PC游戏开发商只好绕开Windows而仍旧开发DOS下的游戏。

为了改变这种难堪的局面,促使游戏界放弃DOS而使用Windows,微软需要在设备无关性与高性能之间取得某种平衡,决定为Windows添加一种高性能的动画机制(以及后来的输入与音响等),因此于1995年推出了Game SDK,后来改名为DirectX。其中的Direct指可以直接访问多媒体硬件;X指它的不同组成部分,如Direct3D、DirectSound、DirectInput和DirectPlay等等。

14.1.2  版本与功能

因为DirectX必须支持多媒体设备的最新技术和功能,而多媒体硬件(尤其是显卡[的3D性能])和技术始终处在高速发展过程中,所以DirectX的技术和版本也同样在不断地发展和演变,其中发展最快的是3D接口部分。

下面列出DirectX的主要版本的发布时间、引入的新模块和特性:

l 1.0——1995年9月30日:DirectDraw、DirectSound、DirectInput、DirectPlay、DirectSetup;

l 2.0——1996年6月5日:引入Direct3D(次版本有2.0a);

l 3.0——1996年9月15日:支持MMX、为DirectSound 补充DirectSound3D API(次版本有3.0a);

l 4.0——无此版本号;

l 5.0——1997年7月16日:有许多改进,如受力反馈控制器、多显示器支持、新的游戏控制面板、用户界面的全面改进等(次版本有5.1和5.2);

l 6.0——1998年8月7日:添加新的3D特性(如添加DXUT框架)、支持AMD公司的3DNow!技术、性能较5.0有提高。在1999年2月3日推出的6.1版中,添加了DirectMusic模块;

l 7.0——1999年9月22日:改进3D图形和声音、性能更快,为Direct3D API引入硬件传送、光照和纹理压缩、以及硬件加速,引入D3DX工具库。使用Creative公司的EAX技术改进3D声音的算法(次版本有7.0a和7.1);

l 8.0——2000年9月30日:将DirectDraw与Direct3D完全集成在一起、其中Direct3D的性能有了本质上的飞跃(引入顶点/像素shader[着色引擎/光照模型]、支持硬件点精灵和三维体纹理),将DirectMusic与 DirectSound更紧密地集成在一起构成DirectX Audio,更新了DirectInput与DirectPlay,添加了DirectShow、抛弃了其余的DirectX Media模块。2001年11月11日推出的8.1版,被集成在Windows XP中销售,该版本添加了从DirectShow分离出的DMO(DirectX Media Objects媒体对象)组件模块。它还支持许多新的图形特性,如像素着色引擎的1.2~1.4版、动态/高分辨率纹理、新3D扩展方法等(次版本有8.0a、8.1、8.1a和8.1b);

l 9.0——2002年12月24日:添加许多新特性到DirectX Graphics和DirectShow中,例如将DirectDraw的功能并入到Direct3D之中,支持顶点和像素着色引擎的新版本2.0和3.0,引入裁剪测试、位移贴图和多元纹理,支持128位浮点着色精度和根据显示器自动调整γ值等。也添加若干新特性到DirectInput、DirectPlay、DirectSound和DirectMusic中。(次版本有9.0a、9.0b和9.0c)。

DirectX的最后一个以数字和字母命名的版本,是2004年8月9日推出的9.0c。后来每两到四个月就推出了它的一个升级版,当前的最新版本为2010年6月7日推出的June 2010 DirectX SDK。它们都包含了(于2002年推出的专为.NET框架设计的)托管(Managed)DirectX,将原来DirectX多个分离的COM模块集成到了一个容易使用的单一CLR文件之中。

l 10——DirectX不会有独立的第10版了,因为微软公司已将DirectX的功能集成进其操作系统Windows Vista中,而不再将其作为一个额外的模块了。DirectX 10(其主要部件为Direct3D 10)已于2006年11月30日随Windows Vista一起发布(被嵌入到该操作系统之中)。DirectX 10有如下特点:

n  全新的显示驱动模式——微软为Vista和DirectX 10重新设计了一种显卡的显示驱动模式VDDM(Vista Display Driver Model),它将显卡驱动程序与系统的其他驱动程序分开,并能使之运行于独立硬件供应商模式和用户模式下,使得由显卡驱动规格差异所导致的3D 应用程序不兼容情况大幅度降低,从而提高整个系统的稳定性。此外,DirectX 10 还重新优化了显存管理功能,降低了游戏开发商开发工作的复杂程度。

n  全新的API——由于DirectX 10 的渲染方式发生了巨大的变化,微软重写了API的大部分代码,去掉了设备能力检查(CAPS),即去除了对老版本Direct3D的硬件支持,使得开发商不必担心兼容性问题而放心地使用硬件的各种特性。此外,微软还对渲染管线流程进行了大面积改进(参见图14-1),全面使用着色器化的架构,将渲染状态有机分类,极大地减少了开发者在开发大型游戏时的技术难度,并且也有助于提升渲染能力,减少渲染状态前后设置和互相影响对渲染成功率的影响,从而提高3D应用程序的执行速度和质量。新加入的几何着色器则提供了对批量几何图形的处理能力,也有助于程序执行效率的提高。

n  Shader Model 4.0——Shader Model(着色器模型)是微软公司定义图形平台性能的一个标准,着色器是渲染像素和顶点的小程序,分为顶点着色器(Vertex Shader)和像素着色器(Pixel Shader)两种类型,这些程序能够向基本的几何图形添加效果。从图14-1中的渲染管线流程中我们可以看到,Shader Model 4.0 将作为DirectX 10 的核心存在,并且,由于DirectX 10 去除了CAPS,那么对Shader Model 4.0 的硬件支持,也就成为了一块DirectX 10 显卡的必备条件。这将有助于消除不同显卡厂商的产品在技术参数上的差别,减少消费者的选购难度。同时,Shader Model 4.0将能够同时访问的顶点数在3.0的基础上增加了8倍,并将材质顶点支持模式变为RGBE,极大地提高了光照处理性能。

n  支持困难——DirectX 10放弃了对以前版本的硬件支持,这意味着采用DirectX 9以及以前版本API编写的3D应用程序只能通过软件模拟方式得到DirectX 支持,这对程序的运行效率是有负面影响的。诸多全新的游戏特性使得现在支持DirectX 9 的显卡虽然也能勉强在DirectX 10下正常工作,但大部分新特性如Shade Model 4.0等则都无法使用。而由于需要VDDM的支持,目前微软声称DirectX 10支持的最低版本的操作系统为Windows Vista,而Windows XP 将无法使用DirectX 10。而WindowsVista对硬件的苛刻要求,目前的机器恐怕大多难以胜任。

图14-1是DirectX 10.0与DirectX 9.0的Direct3D管线阶段的比较。

图14-1  DirectX 9.0(左图)与DirectX 10(右图)的管线阶段

 

l 10.1——微软公司于2008年2月4日,随Vista SP1发布了DirectX 10的升级版DirectX 10.1,它具有如下改进:

n  DirectX 10.1的一个主要提高是改善的shader资源存取功能,在读取多样本时有更好的控制能力。除此之外,DX10.1还将可以创建定制的下行采样滤波器。

n  DirectX 10.1还将有更新的浮点混合功能,对于渲染目标更有针对性,对于渲染目标混合将有新的格式,渲染目标可以实现独立的各自混合。

n  阴影功能一直是游戏的重要特效,Direct3D 10.1 的阴影滤波功能也将有所提高,从而可望进一步提高画质。

n  在性能方面,DirectX 10.1将支持多核系统有更高的性能。而在渲染,反射和散射时,Direct3D 10.1将减少对API的调用次数,从而将获得不错的性能提升。

n  其他方面,DirectX 10.1的提高也不少,包括32bit浮点滤波,可以提高渲染精确度,改善HDR渲染的画质。完全的抗锯齿应用程序控制也将是DX10.1的亮点,应用程序将可以控制多重采样和超级采样的使用,并选择在特定场景出现的采样模板。DirectX 10.1将至少需要单像素四采样。

n  DirectX 10.1还将引入更新的驱动模型,WDDM 2.1。与DirectX 10的WDDM2.0相比,2.1有一些显著的提高。首先是更多的内容转换功能,WDDM2.0支持处理一个命令或三角形后进行内容转换,而WDDM2.1则可以让内容转换即时进行。由于GPU同时要并行处理多个线程,因此内容转换的即时性不仅可以保证转换质量,还可以提升GPU效率,减少等待时间。另外,由于WDDM 2.1支持基于过程的虚拟内存分配,处理GPU和驱动页面错误的方式也更为成熟。

目前只有AMD的Radeon HD3000系列产品支持DirectX 10.1。

l 11——微软公司于2009年10月22日随Windows 7发布Direct3D 11。在DirectX 11中,微软主要目标在于减少游戏工作室的开发成本,与新PC硬件更有效结合,提高物理效果、游戏AI以及游戏其他功能特性以提高游戏的互动性。随着游戏画质不断提高,图形细节的复杂程度也大幅提升。微软已经在游戏主机开发中拥有了不少高效图形开发程序经验,通过更为强大的纹理制作API,DirectX 11将提高纹理生成性能,从而让游戏运行帧数更为流畅。在硬件方面,微软也指出值得注意的发展趋势——CPU并行多核心化。DX11将在并行运算处理能力利用上进一步改进,通过新的完善的驱动界面支持并行多核心处理器平台。流处理以及GPGPU也是图形领域的重要发展方向,DX11将在未来对这些新技术提供支持。

DirectX 11的主导者不是微软,而是Intel。因为Direct3D 11将会支持Intel的光线追踪(Ray Tracing)技术,该技术可使得3D图形更加真实、更具立体感,而不是一看就能看出来是在一个平面上显示出来的效果。相对于目前的光栅化技术(rasterizATIon),光线追踪更加注重从视觉上改变3D(主要运用到折射)物体的效果,而不是rasterizATIon那样通过几何原理.当然,用户不用担心使用现在的显卡不能安装DirectX 11,因为DirectX 11会有两种模式,可以说是rasterizATIon模式和Ray Tracing模式。最值得一提的是Intel的Ray Tracing只能够支持X86架构。D3D 11的主要目的有提高伸缩性、改善开发体验、拓展GPU能力、改善性能。它是D3D 10/10.1的超集,在其基础上增加了一些新功能,支持Windows Vista和后续操作系统Windows 7等,支持DX10/10.1级别硬件。

D3D 11的主要新技术有:Tessellation(镶嵌)、计算着色器(Compute Shader)、多线程、动态着色器关联、改进的纹理压缩等等。角色创作的趋势是越来越复杂,三角形和多边形越来越多,对渲染管线和输入输出提出了更大的挑战,因此需要更高级的表面呈现技术。为此,D3D 11新增了三个着色流程:Hull Shader(外壳着色器)、Tessellation(镶嵌)和Domain Shader(域着色器),使其着色器管线更加丰富和复杂。参见图14-2。

 

图14-2  Direct3D 11管线(绿色模块为Direct3D 11管线新加的)

l XNA——另外,作为学生和业余爱好者的DirectX替代产品,微软公司于2004年3月24日宣布了用于托管运行环境下计算机游戏的设计、开发和管理的框架和工具集XNA(XNA's Not Acronymed,XNA不是首字母缩写),并于2006年12月11日推出了XNA Framework Redistributable 和XNA Game Studio Express的1.0版,可用于Windows和Xbox 360游戏的开发。微软公司后来又分别于2007年12月13日、2008年10月30日、2009年6月 11日和2010年9月16日推出了XNA Game Studio的2.0、3.0、3.1和4.0版。

14.1.3  结构

DirectX是一种基于COM(Component Object Model,组件对象模型)的系统,它既不属于驱动程序层,也不属于应用层。DirectX的主要设计目标是在提供某种设备独立性的同时获取高速度,为此微软公司为DirectX设计了如图14-3所示的体系结构。其中:

 

图14-3  传统的DirectX子系统

l HAL = Hardware Abstract Layer(硬件抽象层)——负责检测本机的硬件功能,并以一种独立于设备的方式提供这些功能;

HEL = Hardware Emulation Layer(硬件模拟层)——负责提供DirectX功能中本机硬件不支持部分的模拟实现。

但是从8.0版起,DirectX就不再提供硬件模拟层HEL模块了,需要开发商、第三方或自己来编写一个PSD(Pluggable Software Device可插式软件设备)连到DirectX提供的HEL接口上,称之为参考设备。但是现在很少有这样的PSD可用,因此新版本的DirectX是严重依赖于硬件的。

 

14.1.4  组成

DirectX由多个(COM组件)模块组成,而且随着版本的演化,这些模块也在不断地增减、合并和改变。最新的DirectX组件的模块构成如图14-4所示,括号中的数字为该模块被首次引进(或移出)的版本号。

下面是DirectX的主要组成模块的简单介绍:

l DirectX Graphics(DirectX图形)——包括DirectDraw和Direct3D等:

n 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的最新版本为Durect3D 10,它是Windows Vista的一个有机组成部分 。

u D3DX(Direct3D eXtension,Direct3D扩展)——为Direct3D服务的实用工具库,执行公共的数学计算和一些复杂的任务,包含若干简化3D模型使用的类,如粒子系统(particle system)。D3DX由动态链接库(DLL)提供。

u DXUT(DirectX UTility library,DirectX;DirectX实用工具库,编程框架)——建立在Direct3D API之上的样例框架,也叫通用文件框架,可帮助程序员减少在繁琐的平凡工作(如创建窗口、创建设备、处理Windows消息和设备事件等)上所花的时间。

u DXGI(DirectX Graphics Infrastructure,DirectX图形基础设施)——管理可独立于DirectX图形运行环境的低层任务,为DirectX的未来版本提供一个通用框架。

u HLSL(High Level Shading Language,高级着色语言)——用于为Direct3D管线创建似C的可编程着色器,从DirectX 8.0起引入。

u DDS(DirectDraw Surface,DirectDraw表面)—— DirectX 7.0引入的一种文件格式(.dds),用于存储压缩(DXTn)和非压缩纹理。DDS支持MIP(Multum In Parvo,小步前进[拉丁短语])映射、立方映射和体映射。DDS文件格式还被D3DX和DirectX纹理编辑器(Dxtex.exe)及纹理转换工具(Texconv.exe)等其他DirectX工具支持。从Direct3D 10开始,DDS文件支持纹理数组。

l DirectX Audio(DirectX音频)——包括DirectSound和DirectMusic等:

n DirectSound(直接声音)——主要针对波形音频,底层接口。可用于开发播放和捕捉波形音频的高性能立体与三维(DirectSound 3D)音频应用程序。在下一代DirectX中,DirectSound的功能将由XACT(Microsoft Cross-Platform Audio Creation Tool微软跨平台音频生成工具)来代替。

n DirectMusic(直接音乐)——主要针对MIDI音乐,高层接口。为基于波形、MIDI声音或DirectMusic生成器所创造的动态内容之音乐和非音乐声道提供一个完整的解决方案。

n XACT——XACT(Microsoft Cross-Platform Audio Creation Tool,微软跨平台音频生成工具)是一种多人合作的音频设计工具和相关API,用于游戏的动态音频开发。随DirectX 9.0c的2008年3月升级版推出XACT3的RTM版。

n XAudio2——是针对Windows和Xbox 360的一种低级、跨平台的音频API。它为游戏提供信号处理和混频基础,用于替代Windows上传统的DirectSound和Xbox 360上早先的XAudio。XAudio2的RTM(Release To Manufacturing / Marketing,发行给制造业/销售)版随DirectX 9.0c的2008年3月升级版推出。

n X3DAudio——是用于在XAudio2和XACT的协助下进行三维空间中声音定位的一种API,可创建来自3D空间中相对于摄像机的位置点的魔幻声音。

n xWMA——是WMA(Windows Media Audio,Windows媒体音频)专业压缩格式的一个子集。XAudio2和XACT3都支持xWMA的软件解码。xWMA对WMA位流格式进行了一种轻量级包装,提供比XMA更大的压缩率。xWMA对使用小CPU达到可获取大压缩比时的对话和音乐非常有用。质量设置允许用户改变被压缩声音的比特率。xWMA随DirectX 9.0c的2008年3月升级版推出。

n XAPO——XAPO(Cross-platform Audio Processing Objects,跨平台音频处理对象)API允许在Windows和Xbox 360上用XAudio2和XACT创建跨平台音频处理对象的API。XAPO是一种对象,它接受输入的音频数据,并在传递之前对该数据执行某些操作。XAPO可用于完成多种任务,包括添加混响到音频流和监控峰值音量水平。

n XAPOFX——XAPOFX(XAPO effect library,XAPO效果库)是用于XAudio2实现XAPO接口的一个音效集合。XAPOFX包含几种效果和一个创建效果实例的通用机制。

与DirectX相关的各种音频技术之间的关系如图14-5所示。

图14-5 音频技术的关系

l DirectInput(直接输入)——提供对各种输入设备的支持,包括对受力反馈(force-feedback)技术的全面支持。从DirectX 9.0c的2005年10月升级版开始,DirectInput已被XInput (Xbox)和键盘与鼠标的窗口消息处理(Windows)代替。

l DirectPlay(直接玩)——提供对多人网络游戏的支持。在DirectX 9.0c版本中,微软公司反对(deprecate)使用DirectPlay,而建议改用Windows Sockets和Windows Firewall API来代替。从DirectX 10(Vista)开始,DirectPlay已被Games for Windows – Live 和Xbox Live代替。

l DirectSetup(直接安装)——提供DirectX组件的一次性调用安装的一个简单API(自动安装DirectX驱动程序)。从Vista开始,Windows操作系统包含DirectX模块,不再需要另外安装。

l DirectShow(直接展示)——提供多媒体(音视频)流的高质量捕捉和重放。在8.0版之前,DirectShow是DirectX Media的一个组成模块。到8.0版时,因为DirectX SDK抛弃了DirectX Media,所以才将DirectShow集成到了DirectX之中。在DirectX 9.0c的2005年4月升级版中,DirectShow又被移出DirectX,放入微软公司的Windows平台SDK之中。

l DirectX Media Objects(DirectX媒体对象,DMO)——基于COM的多媒体和数据流组件,支持音视频的编解码器和特效。是在DirectX的8.1版时,从DirectShow分出的,其功能类似于DirectShow的过滤器。

l DirectX Media(DirectX媒体)——是一个用于流媒体应用的外部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被集成到了DirectX之中),其功能被随Windows 2000 Server推出的Windows Media SDK所代替。

n DirectX Transform(DirectX变换)——用于产生二、三维图形的各种效果,如α混色和表面弯曲等。

n DirectAnimation(直接动画)——集成多种媒体类型来创建复杂动画,并可用作网页内容。

n DirectX Video Acceleration(DirectX视频加速DXVA)——利用硬件加速二维视频的解码操作。

n Direct3D Retained Mode(Direct3D保留模式)——Direct3D的保留模式是一种高层API,建立在Direct3D立即模式之上,使用起来方便容易,但是效率不高,适合于初学者。

DirectShow(直接展示)——支持音视频流的高质量采集和重放。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值