DX8.1是DirecetX8.1的缩写
DirectX 8.0 简介
欢迎关注 Driving DirectX。在本月的栏目中,我们将开始探索 Microsoft® DirectX® 8.0。首先,我们将概括介绍这个新版本为开发人员提供的所有精彩特性。您可以在 DirectX 开发人员中心(英文)找到 DirectX 8.0 运行时和 SDK 的下载链接。有些人说,在相当长一段时间内,这将是最强大的 DirectX 版本。下面的新特性列表为这一说法提供了证明。
前言
DirectX 8.0 的每个组件都包括了重要的新特性,它们极大地增强了 DirectX 的功能。图形、音频和网络三个组件被彻底重写。DirectInput® 包括了新的配置功能、操作映射和更好的国际化支持。DirectShow® 第一次作为 DirectX 的一部分出现在运行时和 SDK 中。
简而言之,DirectX 8.0 提供的新特性包括:
DirectX Graphics——集成 DirectDraw 和 Direct3D
Microsoft DirectDraw® 和 Microsoft Direct3D® 并入了 DirectX Graphics 组件。API 已经进行了大幅度更新,现在更容易使用,并且支持最新的图形硬件。最引人注目的新特性是支持可编程着色器(着色器是用着色语言编写的一段代码,着色语言是专为在可编程顶点流水线或可编程像素流水线中使用而设计的)。
DirectX Audio——集成 DirectMusic 和 DirectSound
Microsoft DirectMusic® 和 Microsoft DirectSound® 现在紧密集成到新的 DirectX Audio 组件中。WAV 文件或其他资源现在可以由 DirectMusic 加载器加载,通过 DirectMusic 演奏器进行播放,并用 MIDI 音响进行同步。
DirectPlay 可伸缩性和性能更佳
Microsoft DirectPlay® 组件进行了大幅度更新,其易用性和功能均得到改进,在可伸缩性和性能方面尤为显著。此外,DirectPlay 现在还支持玩家之间的语音通讯。
DirectInput 中的操作映射
Microsoft DirectInput 引入了一个重要的新特性:操作映射。通过操作映射能够在输入操作和输入设备之间建立连接。您只需输入设备处理,而不必再依赖特定的设备对象。
DirectX 中包含 DirectShow
现在 Microsoft DirectShow 是 DirectX 的一个组成部分,在此版本中已经进行了更新。
下面按每个组件详细地介绍这些新特性。
DirectX 8.0 Graphics
DirectX 8.0 Microsoft Direct3D® API 接口中加入了许多新特性,许多原有性能也得以增强。
DirectDraw 和 Direct3D 完整集成
可编程顶点处理语言
可编程像素处理语言
多重采样渲染支持
点对象
三维立体纹理
更高阶的图元支持
针对各种 D3D 的三维内容创建工具支持
带索引的顶点混色
扩展的 Direct3DX 工具库
DirectX Graphics 的一个最显著的变化是将 DirectDraw(二维图形接口)和 Direct3D(三维图形接口)合并为一个公用接口。迄今为止的很长一段时间内,DirectDraw 和 Direct3D 一直相互交叉,因此,将它们划分为两个独立的接口越来越不适应发展。新的集成简化了 Direct3D 核心的初始化和控制,使这些操作更加简单。这种变化不仅简化了应用程序的初始化,而且改进了数据分配和管理的性能,从而减少了内存的占用。合并接口的另一个原因是 DirectDraw 的开发几乎完全停止了,在 DirectX 6.0 和 DirectX 7.0 中对它所作的修改仅仅是稍作美化。
图形 API 的集成还启用了并行顶点输入流,使动态应用数据结构的映射更加灵活。
可编程着色器的加入可以说是 DirectX 8.0 中 Direct3D 更新的最显著特性。语言的扩充性非常好——考虑到未来几年内图形硬件方面将涌现大量新特性,我们对着色语言所进行的小小补充将会获得数倍的回报。着色语言是同时为顶点处理和像素处理提供的。
可编程顶点处理语言使程序员可为下列情况编写硬件着色器:
变形/过渡动画
定义矩阵调色板外观
用户定义的光照模型
一般的环境贴图
过程性几何图形
任何其他开发人员定义的算法
可编程像素处理语言使程序员可为下列情况编写自定义的硬件着色器:
一般的纹理合并表达式
按像素光照(凹凸贴图)
按像素环境贴图(用于照片级真实效果)
其他开发人员定义的算法
请注意,为顶点和像素操作而添加的着色语言与用在顶点流水线中的变换和光照以及用在像素流水线中的多重纹理等“旧”方法同时存在。图 2 说明了 DirectX 8.0 图形流水线。
图 2:DirectX 8.0 图形流水线对新旧方法的支持
另外一些精彩特性使得实现各种特殊效果更加简单。多重采样渲染支持可以实现全方位的反走样和多重采样效果,例如动态柔化和景深。点对象支持可以实现闪烁、爆炸、下雨、下雪等微粒系统的高性能渲染。立体纹理可在按像素光照和立体模糊效果中实现区域衰减,并可以应用到更复杂的几何图形中。
更高阶的图元支持改善了三维内容的外观,用主流三维创作工具创建的内容的映射也更为简单。另外,DirectX 8.0 Graphics 还包括三维内容创建工具插件,可将外观网格导出到 .X 文件,以便以后在 Direct3D(使用各种 Direct3D 技术)、多重精度级别细节 (LOD) 几何图形和更高阶曲面数据中使用。带索引的顶点混色扩展了几何图形混色支持,这样,用于顶点混色的矩阵就能够通过矩阵索引来引用。
Direct3DX (D3DX) 工具库中添加了大量功能,在 Direct3D 之上构造的帮助器层简化了三维图形开发人员所遇到的常见任务。D3DX 现在包括“定义外观”库(支持使用网格)以及用于装配顶点和像素着色器的功能。请注意,原来由 D3D_OVERLOADS 提供的功能现在已经移到 D3DX 工具库中。(D3D_OVERLOADS 在 Microsoft DirectX 5.0 中首次引入。)
DirectX Audio
Microsoft DirectX 8.0 Audio 为播放集成的音乐和声音效果提供了新的体系结构。尽管仍然使用名称 Microsoft DirectSound 和 Microsoft DirectMusic,但在它们之间已经没有明显的区别。希望将来 DirectMusic API 能够成为创建交互式声音效果的首选 API。
DirectX 8.0 Audio 的部分新特性包括:
.wav 文件和基于消息的声音集成在一个播放机制中
音频通道模型更加灵活、强大,其中包括对段落状态进行个别控制
DLS2 合成,包括特殊效果
音频脚本编写
容器对象,用于在单个文件中保存 DirectMusic Producer 工程的所有组件
对演奏、段落和声道的更强大的控制
新的音频体系结构将 DirectMusic 合成器作为主要的 DirectX 8.0 Audio 声音生成器。这一高度优化的可下载声音级别 2 (DLS2) 合成器可以创建所有的声音,对它们进行混音,并将结果发送到 DirectSound 缓存,以便进行进一步的处理。DirectMusic 合成器也可以在输出之前将多个独立的声音进行混音。这样,多个独立的声音可以通过同一种音频效果进行处理,并分配到三维空间中的同一个位置。它们只使用一个 DirectSound3D 缓存,将 CPU 的使用和对三维硬件的要求降至最低。请参阅图 3,以了解新的音频体系结构。
图 3:DirectX 8.0 Audio 体系结构
.wav 文件和资源现在可以通过 DirectMusic 加载器加载,并通过 DirectMusic 演奏器播放。应用程序不再需要分析 .wav 文件,并将其复制或流入 DirectSound 缓存。.wav 文件播放的定时基于 DirectMusic 主时钟,.wav 文件可以在音乐事件发生的同时播放,并可以象其他段落一样通过工具处理。DirectSound API 仍然会得到支持,您仍然可以通过 DirectSound 缓存直接播放 .wav 文件。DirectSound 仍将是用于 .wav 文件捕获和全双工的 API。
在以前版本的 DirectMusic 中,演奏通道被映射到端口,同时每个端口将其输出发送到一个 DirectSound 缓存。在新的模型下,段落中的声道被映射到音频通道,控制数据从演奏器流向最终输出。合成器的输出可以发送到多个播放缓存,而每个播放缓存有自己的三维位置和效果。音频通道由应用程序动态创建,或者设计在段落中。段落的每个播放实例都有自己的音频通道,因此可以单独修改每个段落状态的音量、音质和音调等参数。
DirectMusic 合成器现在基于 DLS2 标准,能够提供更高质量的声音合成。DLS2 合成器的新特性包括六级封装、语音分层、释放波形和额外的低频振荡器 (LFO)。每个语音都有一个可选的低通谐振过滤器。作为新的音频体系结构的一部分,DLS2 合成器可用于简单的声音效果播放,包括:
任意循环点
每个声音的过滤器
混音
自动流播放
用于播放的 ACM 编解码集成
效果处理总线
轻松加载 .wav 文件
通过使用脚本,作曲家和音效设计师可以对演奏器进行更自如的控制。应用程序不需要处理播放的细节,而代之以调用脚本。例如,一个游戏事件可能触发一个脚本函数。通过修改函数,脚本作者可以轻松地修改声道对游戏事件的响应。
DirectMusic Producer 工程的所有组件都可以保留在一个文件中,查找和加载所有对象非常容易。容器也可以嵌在段落中,因此播放一个段落所需要的所有内容都可以保存在这个段落中。
DirectX Audio 对演奏、段落和声道的控制更加强大。演奏通知事件现在有一个新的通知类型 DMUS_NOTIFICATION_MUSICALMOSTEND,它表示队列中的最后一个主段落即将结束。这样,应用程序就有机会来计划播放新的段落。
段落的新特性包括:作曲家可以在段落中设置点,指定从何处开始播放段落,从而维护段落与时间签名之间的关系。主段落可以包含联接其他段落的任意点。这些点不仅可以联接最近的小节、节拍或网格,还可以进行更多的控制。在当前主段落完成播放时,可以播放新的段落联接标志 DMUS_SEGF_SEGMENTEND 指定的段落。新的 DMUS_SEG_REPEAT_INFINITE 标志使得一个段落可以播放无限多次。
对于声道,新的配置和播放标记使得每次播放或循环播放某个段落时,都可以对声道进行改写。例如,可以配置和弦声道,使得每次播放该段落时,都建立新的和声进行。应用程序可以单独设置各个声道的配置,禁用播放和参数控制。声道可以配置为根据时钟时间而不是音乐时间进行操作。通过配置自控段落中的声道,可以用它来替代主段落或控制中的参数声道。最后,包含歌词声道的段落可以将时间戳记文字发送到演奏器。
限于篇幅,其他的新音频特性在这里不再赘述。如果您正在深入研究音频,研究 DirectX 8 的音频特性可能要花费您的大量时间。请参阅 SDK 中的新文档和范例。
DirectX 8.0 DirectPlay
DirectPlay 是应用程序和通讯服务之间的高级软件接口。有了 DirectPlay,通过 Internet、调制解调器链接或网络来连接游戏将非常简单。DirectPlay 既提供了高级的传输层服务(例如,有保证或无保证的传递,慢速链接上的通讯扼杀,以及放弃连接检测等),也提供了会话层服务(包括玩家名称表管理和点对点主机转移)。图 4 显示了 DirectPlay 体系结构,以及它如何提供与通讯服务提供程序无关的独立性。
图 4:DirectPlay 体系结构
下面是 Microsoft DirectPlay API for DirectX 8.0 的新特性列表:
接口已经完全重写。
前端操作现在与 DirectPlay 的其他部分无关。
已经加入了语音传输。
寻址信息已经从基于 GUID 的数据格式变为基于 URL 的数据格式。
可伸缩性更强大,内存管理更完善。
对防火墙和网络地址翻译器 (NAT) 的支持更佳。
分离创建点对点会话和客户端/服务器会话的接口,使创建网络应用程序的复杂度得到了奇迹般的简化。用于创建 DirectPlay 传输会话的接口包括:
IDirectPlay8Peer,提供创建点对点会话的方法
IDirectPlay8Client,提供创建客户端/服务器应用程序的客户端部分的方法
IDirectPlay8Server,提供创建客户端/服务器应用程序的服务器端部分的方法
DirectPlay 不再要求前端客户端只能与 DirectPlay 应用程序配合使用。这样,前端服务提供程序和应用程序都可以实现 DirectPlay,而无须相互匹配。前端实施现在分为两个简化的接口:
IDirectPlay8LobbyClient,用于管理前端客户端,以及计算和启动前端识别应用程序。
IDirectPlay8LobbiedApplication,用于在系统中注册可由前端启动的应用程序,使它真正能由前端启动。它也用于从前端获取连接信息,使游戏启动时无需查询用户。
DirectPlay Voice 提供了一组接口,用于给应用程序添加实时语音通讯。下列新接口提供了语音支持:
IDirectPlayVoiceClient 提供了在 DirectPlay Voice 会话中创建和管理客户端的方法。
IDirectPlayVoiceServer 提供了承载和管理 DirectPlay Voice 会话的方法。
IDirectPlayVoiceTest 用于测试客户端计算机上的音频设置。
图 5 显示了使用 DirectPlay Voice 时可用的组件。
图 5:DirectPlay Voice 组件
以前版本的 DirectPlay 通过 GUID 地址使用二进制数据块,难以实现和读取。在 DirectX 8.0 中,DirectPlay 引入了 URL 格式的地址表示方法,并使用一组新的接口来创建和操作新的寻址格式:
IDirectPlay8Address 提供用于创建和操作 DirectPlay 地址的基本寻址方法。
IDirectPlay8AddressIP 提供 IP 提供程序专用的寻址服务。
就 DirectX 8.0 而言,DirectPlay 已经被彻底重写,以便提供卓越的性能和强大的可伸缩性。用户带宽的增长给网络游戏设计和实施带来了天翻地覆的影响。改进的 DirectPlay 线程缓冲池管理使开发人员更容易设计可变化而且更可靠的应用程序,能够同时支持大量联机玩家。
编写跨越 NAT、防火墙和其他 Internet 连接共享 (ICS) 方法的网络游戏可能会非常困难,针对无保证 (UDP) 通讯编写网络游戏尤其困难。在 DirectX 8.0 中,DirectPlay 开发时已经注意了这些问题,它将支持可能的 NAT 解决方案。DirectPlay TCP/IP 服务提供程序对游戏数据使用单一的、开发人员可选的 UDP 端口,从而可以适当地配置防火墙和 NAT。另外,DirectPlay 使用了 UDP,因此对于客户端/服务器体系结构的游戏来说,某些 NAT 后的客户端可以直接连接到游戏,而无须进行额外的配置。
DirectX 8.0 DirectInput
DirectInput 为游戏杆、头盔、多键鼠标以及力回馈设备等各种输入设备提供了最先进的接口。通过直接与设备驱动程序配合,DirectInput 绕过了 Windows 消息系统,提供了最佳性能。
Microsoft DirectInput API for DirectX 版本 8.0 中新特性的列表如下:
操作映射
对国际化应用程序的支持更佳
新的接口创建支持
对游戏杆滑块数据的更改
操作映射是支持输入设备方面的一个重大进步。操作映射简化了输入循环,降低了游戏中对自定义游戏驱动程序、自定义设备分析器和自定义配置用户接口的需要。操作映射也包括了默认的用户接口,使用户可以快速简便地配置设备。这种标准 API 通过低级用户接口 API 来实现,使应用程序可以在其自定义用户接口中直接访问设备映像。
DirectX 8.0 中的 DirectInput 设备支持新的属性,这些属性可以处理从国际化键盘上输入的本地化的键名。共添加了两个键盘属性:DIPROP_KEYNAME,用于检索本地化的键名;DIPROP_SCANCODE,用于检索扫描码。这些特性对于大多数在全世界发布的基于 DirectInput 的应用程序非常有用。
DirectInput 对象现在通过 IDirectInput8 接口来表示。新的帮助器函数 DirectInput8Create 可创建对象并检索此接口。IDirectInput8 具有一个新 CLSID,并且不能通过对 CLSID_DirectInput 类对象的接口调用 QueryInterface 来获取,这一点与以前的 DirectX 版本有所不同。
游戏杆滑块数据在以前的 DirectX 版本中分配到 DIJOYSTATE 或 DIJOYSTATE2 结构的 Z 轴,现在则位于这些结构的 rglSlider 数组中。尽管这种变化会导致对现有代码的必要调整,但它终究更容易理解。
DirectX 8.0 DirectShow
此版本中的 DirectShow 也进行了大幅度修改。DirectX 8.0 中添加的部分新特性包括:
新的过滤图形特性
Windows Media™ 格式支持
视频编辑支持
新的 DVD 支持
新的 MPEG-2 传输和程序流支持
对广播驱动程序体系结构的支持
DirectX 媒体对象
过滤图形管理器支持一些新的特性,包括动态图形生成和实时来源合成。使用动态图形生成,您现在可以在图形运行过程中对过滤图形进行修改。而以前,要添加或删除过滤器,应用程序必须停止该图形,因而打断数据流。DirectShow 现在还支持实时来源合成——例如,可以将实时音频流与实时视频流合成。
两个新的过滤器使 DirectShow 应用程序可以读取或写入 Microsoft Windows Media 格式的文件。ASF Reader 过滤器用于读取和分析 Windows Media 格式的文件;ASF File Writer 过滤器用于写入 Windows Media 格式的文件,并能够执行必要的复合和压缩操作。DirectShow 和 Windows Media SDK 现在提供了完整的解决方案,用于编写应用程序来创建和播放 Windows Media 格式流。
新的 DirectShow 编辑服务 (DES) API 支持视频编辑。DES 建立在核心的 DirectShow 体系结构之上,提供了一组专门为操作视频编辑工程而设计的接口。DirectShow 的框架更适合于创建视频编辑应用程序,作为应用程序开发人员,您将从中获益匪浅。DES 取代了剪切表,同时剪切表将不再受到支持。
两个新的接口 IDVDControl2 和 IDVDInfo2 极大地扩展了 DVD 导航器的功能。DVD 导航器现在实现了完整的 DVD Annex-J 命令集,既可以播放卡拉 OK,也可以播放影碟。新的 MSWebDVD ActiveX® 控件使这项功能可在基于脚本的应用程序中使用。
新的过滤器 MPEG-2 Demultiplexer 提供了在推模式下(从实时来源接收数据)对 MPEG-2 传输流和程序流的支持。该过滤器与过滤图形中的新实时来源合成支持配合,可以提供优异的 MPEG-2 增强支持。
Microsoft 广播驱动程序体系结构 (BDA) 是新一代数/模电视调制设备的规范。在 DirectX 8.0 中,DirectShow 通过一组新的内核模式设备过滤器和“BDA 调制模型”来支持 BDA 兼容设备。“BDA 调制模型”是一组对象的集合,提供了对各种类型的数字和模拟网络进行调制的方法。
DirectX 媒体对象 (DMO) 提供了编写数据流组件的新方法。与 DirectShow 过滤器相似,DMO 接受输入数据,并将其用于生成输出数据。但是,DMO API 比相应的 DirectShow API 简单得多。因此,DMO 比 DirectShow 过滤器更容易创建、测试和使用。DMO 与 DirectShow 完全兼容。只要您需要使用 DirectShow 提供的服务,例如图形同步、智能连接、数据流的自动处理和线程管理,您都可以使用 DMO。但是,DMO 不需要使用过滤图形,因此应用程序无需 DirectShow 就可以使用 DMO。
DirectX 8.0 版本的 DirectShow 包含更多的功能,但限于篇幅,这里就不再多说。请记着试用新增和改进的 DirectShow。