完美DX10!ATI新王者HD2900XT权威评测
● 第三章:DirectX发展回顾以及DirectX10详细介绍
第一节:技术背景——DirectX 的发展回顾和API相关基本常识。
Microsoft发布的DirectX 10代表了自从可编程Shader出现以来在3D API方面的最巨大的进步,也是自DirectX诞生以来,又一次彻底的重新设计。通过一番脱胎换骨般的重建,DirectX 10展现出一系列非常醒目的新特性,包括高度优化的运行时,强大的Geometry Shader,纹理数组等等;这些特性将引领PC实时三维图形进入一个全新的世界。
DirectX总览
在过去的十年中,DirectX已经稳步成为了Microsoft Windows平台上进行游戏开发的首选API。每一代的DirectX都带来对新的图形硬件特性的支持,帮助游戏开发者们视线更惊人的特效。那么我们也就按照DirectX发展的轨迹,以Direct3D为重点,为读者完整回顾下DirectX的辉煌历程。
● DirectX简介
DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染、交互式音乐和环境音效等高要求应用开发服务的。
通常,Windows对硬件访问的管制非常严格,用通常的办法不易访问,但DirectX通过“硬件抽象层(HAL)”给予了开发人员直接访问硬件的能力,HAL不仅解决了硬件及兼容性问题,而且开发人员可以利用它直接访问计算机的某些硬件设备,例如显示设备的直接显存控制和渲染,键盘、鼠标和游戏杆的控制的直接访问控制,音频设备的直接音频混合与输出能力等等,因此开发人员可以充分利用硬件加速将程序的性能优化到一个新的高度,如果目标机器不支持相应的硬件加速,DirectX还可以仿真加速器以提供强大的多媒体环境。DirectX家族包含的成员有Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectSound、DirectDraw、DirectVoice、 DirectVideo和 DirectShow 。
● DirectX发展历程
1.DirectX 1.0
1995年9月,伴随着Windows95的发布,微软推出了DirectX 1.0。其中,来自于ATI的开发团队为DirectX的开发带来了最基础的图形技术。第一代的DirectX很不成功,推出时众多的硬件均不支持,当时基本都采用专业图形API-OpenGL,缺乏硬件的支持成了其进一步扩大影响的最大障碍。DirectX 1.0版本是第一个可以直接对硬件信息进行读取的程序。它提供了更为直接的读取图形硬件的性能以及基本的声音和输入设备功能(函数),使开发的游戏能实现对二维(2D)图像进行加速。这时候的DirectX不包括Direct3D,还处于一个初级阶段。
2.DirectX 2.0/2.0a
DirectX 2.0
1996年,伴随着Windows95的成功,微软实行了一项新计划,以支持在Windows95上运行更多的3D游戏,目标是扩大市PC领域的游戏市场。于是微软收购了英国的Rendermorphics,Ltd.并得到了名为RealityLab的3D API。经重新整理,微软发布了新的3D API——Direct3D,并整合在DirectX2.0中。
DirectX2.0最大的改善是在Direct Draw,而且为当时风靡全世界的《RedAlert》和《Diablo》所支持,《RedAlert》的Windows版本和《Diablo》都是在DirectX的标准上开发的。除了2D以外,DirectX2.0的D3D部分的雏形基本完成,由于当时3D游戏较少,很多都是基于DOS开发的。世嘉公司的VR战士的PC版本就是基于DirectX2.0开发完成的,虽然效果粗糙了一些,但Direct 3D魅力还是可以感受到的。
在DirectX 2.0中,采用了“平滑模拟和RGB模拟”两种模拟方式对三维(3D)图像进行加速计算的。DirectX 2.0同时也采用了更加友好的用户设置程序并更正了应用程序接口的许多问题。从DirectX 2.0开始,整个DirectX的设计架构雏形就已基本完成。但是当时3D游戏程序更多的是基于3DFX的Glide以及ID的QUAKE引擎(OpenGL)开发,支持Direct 3D的游戏很少。
3.DirectX 3.0/3.0a
1996年后期,微软发布了DirectX 3.0,DirectX 3.0是DirectX 2.0的简单升级版,它对DirectX 2.0的改动并不多。包括对DirectSound(针对3D声音功能)和DirectPlay(针对游戏/网络)的一些修改和升级。DirectX 3.0集成了较简单的3D效果,还不是很成熟。
在微软不遗余力的推广下,DirectX的魅力被众多软硬件厂商看好,让D3D有了与OpenGL与Glide格斗的资本。从这个版本开始,很多玩家知道了DirectX存在,也是这个时候开始出现了可以支持Direct 3D的加速卡,如Nvidia的Riva128,Intel的I740。
当然微软在Direct3D的推广中并不是一帆风顺,也出现过不少波折。微软当时拒绝了在Window95上支持OpenGL并采取异常手段收回对OpenGL的MCD驱动接口的支持,这个做法导致了很多游戏开发者的反对。QUAKE之父John Carmack公开声明拒绝D3D,著名游戏制作人Chris Hecker在游戏开发杂志上发表了两套API的全面分析,并以微软应放弃D3D为结论。以John Carmack为首的56名首席游戏开发者曾联名至信微软,要求其发行OpenGL MCD驱动。
微软则坚持自己的一贯立场:Direct3D面向通用(high-volume)、高性能应用,认为OpenGL只面向高精度的专业CAD应用。所以微软继续增加对Direct3D的投资,并继续削减对OpenGL的投入。
4.DirectX 5.0/5.1/5.2
1997年6月,微软公司跳过了DirectX 4.0,直接推出了DirectX 5.0。DirectX 5.0对Direct3D做出了很大的改动,加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,此外还加入了S3的纹理压缩技术。
同时,DirectX 5.0在其它各组件方面也有加强,在声卡、游戏控制器方面均做了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。
微软的投入也得到了回报,3DFX的GLIDE API开始逐渐失去了过去在游戏开发领域的优势地位,最著名的两个例子就当时称得上是风靡世界的古墓丽影2和优品飞车2,这两个过去本来是GLIDE的御用游戏,都加入了对D3D API的支持,当时著名的Riva 128等非VOODOO显卡也可以通过D3D接口完美的运行游戏。
5.DirectX 6/6.1
1998年7月,DirectX 6正式发布,它的新特性有:几何形体的灵活顶点格式定义、几何形体的顶点缓冲存储、支持多纹理渲染、自动纹理管理、可选深度缓冲(使用Z Buffer或W Buffer)、通过凹凸环境贴图(ENV BUMP ENVMAP,同级别显卡中只有MATROX的G400支持)为反光面和水波特效提供逐像素的渲染和贴图能力。DirectX 6的3D效果更丰富,而且借助硬件的强大性能,可以渲染出高分辨率下的32位色的图像效果。可以看到,这一时期,DirectX 的技术进步速度也远远超过了GLIDE。
6.DirectX 7/7.1
1999年9月,微软推出了DirectX 7.0。DirectX7最大的进步就是支持硬件T&L(Transforms&Lighting),也就是“坐标转换和光源”。上一章已经有过介绍,此处不再赘述。
DirectX 7的其它新特性有:立方体表面的环境贴图、几何渲染、改进的纹理渲染、自动纹理坐标生成、纹理转换、投影纹理和任意面裁剪、D3DX实用库等。
DirectX 7的发布无疑给了GLIDE的致命的一击,DirectX 7提供的特效更丰,D3D函数库的引入方便了开发人员的使用,迅速得到游戏厂商的青睐。为了挽回局面,3DFX甚至还开放GLIDE源代码,但最终GLIDE还是被广大开发人员所离弃。没有了GLIDE的3DFX最终也以被自己的老对手NVIDIA收购而告终。
7.DirectX 8.0/8.1
2000年9月,微软正式推出了划时代的DirectX 8 ,将可编程的着色管线概念正式引入到GPU,新的shaders(着色器)数据处理方式也是DirectX 8中最具意义的创新。Shader采用了新的数据处理程序模型,这与旧有的预定义模型是不同的。这种模型中,数据是透过virtual machine以一个类似于带有特殊汇编指令集的pre-arranged(事先安排好)程序进行处理的,程序员可以直接对其进行编程。
DirectX 8
凭借可编程几何管线和可编程像素管线,使用者可以自由的控制几何和像素的代码设计。这对于图形开发者是空前的,他们可以通过基本的着色器,利用开发工具,产生全新的,极具创造力的效果。也正是可编程管线的引入,为GPU发展翻开了新的篇章,GPU开始向SIMD处理器方向发展,凭借强大的并行处理性能,使得GPU开始用有了部分流式处理器特征,逐渐开始被用于工程方面的通用计算。
DirectX 8的其他特性:编写定制的硬件着色器,例如通用纹理组合公式,逐像素光照(凹凸贴图),适用于实现照片(真实)级镜面效果的逐像素环境贴图或者任何其他开发者定义的算法。 支持多重采样渲染 、高性能的粒子系统渲染、 3D空间纹理 、允许范围衰减、包含了用于输出Direct3D蒙皮网格的三维内容创建工具插件,使用了Direct3D多种不同技术,多分辨率层次细节(LOD)几何、索引顶点混合 、扩充了Direct3DX实用库。
2001年底,Microsoft推出了DirectX8.1,主要的改进是增加了PixelShader 1.2/1.3/1.4。在此之前,Microsoft差不多每年推出一个DirectX新版本,到DX8以后,这个速度开始减缓,以后的DirectX9也是如此。主要的原因是自 DirectX 7以后,每一个版本(major release)实际对应于一代新的显示核心,硬件的更新周期要长于软件,所以作为图形API的DirectX要照顾到软件更新的速度。另外,游戏开发的复杂程度也越来越高,开发周期也越来越长,而游戏开发人员并不希望在开发过程中更新API。
8.DirectX 9.0/9.0b/9.0c
2002年底,微软发布DirectX9.0。DirectX 9中Shader的渲染精度已达到浮点精度,为GPU向通用计算领域的发展迈出了决定性的一步。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。全新高级着色器语言的引入,使得程序员从底层代码中解放出来。
PS 2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多;另外PS1.4只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质数量,新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。
VS 2.0通过增加Vertex程序的灵活性,显著的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。
DirectX9的出现使得OpenGL API在游戏开发领域的应用走到了尾声。目前,除了ID SOFTWARE自家的DOOM、QUAKE系列,基于OpenGL API开发的游戏已经屈指可数了。微软把OpenGL API的应用限制在专业工作站领域的目的已经达到。
DirectX9也有DirectX9.0b和DirectX9.0c两个版本,由于篇幅关系,此处不再详细介绍。