在Windows下开发游戏,大家都会联想到DirectX。实际上,DirectX并不等同于游戏,它也不是写游戏程序的唯一选择。其实,DirectX只是提供了一种更直接的控制硬件的API库而已。当然,它并不是一个单纯的图形API,它还提供了一整套的多媒体接口方案,只不过因为它在3D图形方面表现得特别优秀,让它的其它方面没有显示出来罢了。
DirectX首次出现在1995年,当时被称为“GameSDK”。在其原始形式中,针对的目标是使用C和C++的开发人员。DirectX开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足,发展到现在,它已成为对整个多媒体系统的各个方面都有决定性影响的接口。
DirectX有过多个版本,版本当然是从1.0开始的。
DirectX 1.0
DirectX 1.0是第一个可以直接对硬件信息进行读取的程序。它提供了更为直接的读取图形硬件的性能(比如显示卡上的块移动功能)以及基本的声音和输入设备功能(函数),使开发的游戏能实现对2D图像进行加速。这时候的DirectX不包括现在所有的3D功能,还处于一个初级阶段。
当然,第一代的DirectX并不很成功,它还远远落后于OpenGL这样的图形API,同时它推出时许多的硬件并不支持,缺乏硬件的支持成了其流行的最大障碍。
其实,在图形编程API出现之前,3D应用程序都是通过直接向图形硬件发送命令来完成图形的绘制工作的。虽然这样开发工作比较繁重,但硬件效率则能在很大程度上得到保证。DirectX和OpenGL这样的图形API都是在图形硬件和应用程序之间架起了一个中间层,这样,应用程序可以使用统一的图形编程代码来完成对底层硬件的操作,将程序员从与大量的图形硬件交互的噩梦中解救出来。
DirectX 2.0
DirectX 2.0在2D图形方面作了一些改进,增加了一些动态效果,采用了Direct 3D的技术。DirectX 2.0采用了“平滑模拟”和“RGB模拟”两种模拟方式对3D图像进行加速计算。同时也采用了更加友好的用户设置程序,并更正了应用程序接口的许多问题。从DirextX 2.0开始,整个DirectX的设计架构雏形就已基本形成。这样,DirectX 2.0与1.0就有了相当大的不同。
DirectX 3.0
随着Windows 95的发布,3D游戏也开始深入人心,与此同时,DirectX也逐渐得到软硬件厂商的认可。于是,微软推出了DirectX 3.0。其实,在当时的情况下,微软的DirectX已经和专业的OpenGL接口以及3DFX公司的Glide接口三分天下,成为当时图形接口标准之一了。而当时的3DFX公司是最为强大的显卡制造商,它的Glide接口自然也随着它的显卡的流行受到最广泛的应用。但随着3DFX公司的没落和Voodoo显卡的衰败,Glide接口才逐渐消失了。
DirectX 3.0是DirectX 2.0的简单升级版,它对DirectX 2.0的改动并不多,对DirectSound(针对3D声音功能)和DirectPlay(针对游戏/网络)进行了一些修改和升级。DirectX 3.0集成了较简单的3D效果,还不是很成熟。
DirectX 5.0
不知道什么原因,微软的新版本并没有接着3.0称为DirectX 4.0,而是直接到了5.0。这一版本对Direct3D作了很大的改动,加入了雾化、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。同时,它在其它各组件方面也有加强,在声卡、游戏控制器方面均作了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。
DirectX 6.0
DirectX 6.0推出时,其最大的竞争对手之一Glide,已逐步走向了没落,而DirectX则得到了大多数厂商的认可。DirectX 6.0中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。
DirectX 7.0
其实,DirectX技术和显示卡功能的发展是相互促进的。DirectX 7.0最大的特色就是支持T&L(中文名称是“坐标转换和光源”)。3D游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换。3D游戏中除了场景、物体,还有灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。在DirectX 7.0出现以前,位置转换和灯光都需要CPU来计算,CPU速度越快,游戏表现越流畅。使用了T&L功能后,这两种效果的计算用显卡的GPU来计算,这样就可以把CPU从繁忙的劳动中解脱出来。
DirectX 8.0
DirectX 8.0的推出可以说又引发了一场显卡革命,它首次引入了“像素渲染”概念,同时具备像素渲染引擎(Pixel Shader,PS)与顶点渲染引擎(Vertex Shader,VS),反映在特效上就是动态光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。通过VS和PS的渲染,它可以很容易地构造出真实的水面动态波纹光影效果。
DirectX 9.0
2002年底,微软发布DirectX 9.0。DirectX 9.0主要包括两个版本:DirectX 9.0b和DirectX 9.0c。
DirectX 9.0b中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,有更多的常量,每个程序的着色指令增加到了1024条。但从本质意义上,9.0对8.0的架构并没有进行大的改变,它只是对像素渲染引擎与顶点渲染引擎的功能进行了加强。PS2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多。另外,PS1.x只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质。新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举地实现。VS2.0通过增加Vertex程序的灵活性,显著地提高了老版本(DirectX 8)的VS性能。新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。
与DirectX 9.0b和Sharder Model 2.0相比较,DirectX 9.0c最大的改进,便是引入了对Shader Model 3.0(包括Pixel Shader 3.0和Vertex Shader 3.0两个着色语言规范)的全面支持。举例来说,DirectX 9.0b的Shader Model 2.0所支持的Vertex Shader最大指令数仅为256个,Pixel Shader最大指令数只有96个,而在Shader Model 3.0中,Vertex Shader和Pixel Shader的最大指令数都大幅上升至65535个,全新的动态程序流控制、位移贴图、多渲染目标(MRT)、次表面散射(Subsurface scattering)、柔和阴影(Soft shadows)、环境和地面阴影(Environmental and ground shadows)、全局照明(Global illumination)等新技术特性,使得GeForce 6、GeForce 7系列以及Radeon X1000系列立即为新一代游戏以及具备无比真实感、幻想般的复杂的数字世界和逼真的角色在影视品质的环境中活动提供强大动力。
在DirectX 9.0c中,Shader Model 3.0除了取消指令数限制和加入位移贴图等新特性之外,更多的特性都是在解决游戏的执行效率和品质上下功夫。Shader Model 3.0诞生之后,人们对待游戏的态度也开始从过去单纯地追求速度,转变到游戏画质和运行速度两者兼顾。
DirectX 10
DirectX从开始流行,就一直被一个主要的问题所困扰,那就是高CPU负载。从技术角度,这种CPU负载给3D图像带来两个负面影响:首先,限制了画面中可以同时绘制的物体数量;其次,限制了可以在一个场景中使用的独立的特效的数量。这就使得游戏画面中的细节数量受到了很大的限制,而图像具有真实感的主要要求便是丰富的细节。
DirectX 10的主要优势便是更好、更合理地利用GPU资源,从而降低对CPU的依赖。它主要通过三个途径来达到这个目的:第一,修改API核心,使得绘制物体和切换材质特效时的消耗降低,提高绘图效率;第二,引入新的机制,降低图形运算操作对CPU的依赖性,使更多的运算在GPU中完成;第三,使大量的物体可以通过调用单条DirectX绘制命令进行批量绘制。此外,在DirectX 10中的Shader Model 4.0,引入新的Shader:Geometry shader这是可编程图形流水线的一大进步。它第一次允许由GPU来动态地生成和销毁几何图元数据。通过和新的数据流输出功能配合使用,许多以前无法实施的算法现在都可以在GPU中使用了。同时,vertex、geometry、pixel shader采用了统一的Shader架构。
DirectX 11
DirectX 11并不能算是一个全新的应用程序接口,而是DirectX 10的超集,简单的说DirectX 11就是基于DirectX 10/10.1开发出的技术,主要对DirectX 10和DirectX 10.1功能做出扩展和增强。
Tessellation带来了新的可编程和固定功能渲染流程,可为3D游戏和建模程序同时带来稳定的高帧率(速度)和表面效果。
Compute Shader是挖掘硬件计算能力的新途径,而且没有诸多限制,关键特性包括线程间数据通信、一整套随机访问和流式I/O操作基本单元等,能加快和简化图像和后期处理效果等已有技术,也为DX11级硬件的新技术做好了准备。
DirectX首次出现在1995年,当时被称为“GameSDK”。在其原始形式中,针对的目标是使用C和C++的开发人员。DirectX开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足,发展到现在,它已成为对整个多媒体系统的各个方面都有决定性影响的接口。
DirectX有过多个版本,版本当然是从1.0开始的。
DirectX 1.0
DirectX 1.0是第一个可以直接对硬件信息进行读取的程序。它提供了更为直接的读取图形硬件的性能(比如显示卡上的块移动功能)以及基本的声音和输入设备功能(函数),使开发的游戏能实现对2D图像进行加速。这时候的DirectX不包括现在所有的3D功能,还处于一个初级阶段。
当然,第一代的DirectX并不很成功,它还远远落后于OpenGL这样的图形API,同时它推出时许多的硬件并不支持,缺乏硬件的支持成了其流行的最大障碍。
其实,在图形编程API出现之前,3D应用程序都是通过直接向图形硬件发送命令来完成图形的绘制工作的。虽然这样开发工作比较繁重,但硬件效率则能在很大程度上得到保证。DirectX和OpenGL这样的图形API都是在图形硬件和应用程序之间架起了一个中间层,这样,应用程序可以使用统一的图形编程代码来完成对底层硬件的操作,将程序员从与大量的图形硬件交互的噩梦中解救出来。
DirectX 2.0
DirectX 2.0在2D图形方面作了一些改进,增加了一些动态效果,采用了Direct 3D的技术。DirectX 2.0采用了“平滑模拟”和“RGB模拟”两种模拟方式对3D图像进行加速计算。同时也采用了更加友好的用户设置程序,并更正了应用程序接口的许多问题。从DirextX 2.0开始,整个DirectX的设计架构雏形就已基本形成。这样,DirectX 2.0与1.0就有了相当大的不同。
DirectX 3.0
随着Windows 95的发布,3D游戏也开始深入人心,与此同时,DirectX也逐渐得到软硬件厂商的认可。于是,微软推出了DirectX 3.0。其实,在当时的情况下,微软的DirectX已经和专业的OpenGL接口以及3DFX公司的Glide接口三分天下,成为当时图形接口标准之一了。而当时的3DFX公司是最为强大的显卡制造商,它的Glide接口自然也随着它的显卡的流行受到最广泛的应用。但随着3DFX公司的没落和Voodoo显卡的衰败,Glide接口才逐渐消失了。
DirectX 3.0是DirectX 2.0的简单升级版,它对DirectX 2.0的改动并不多,对DirectSound(针对3D声音功能)和DirectPlay(针对游戏/网络)进行了一些修改和升级。DirectX 3.0集成了较简单的3D效果,还不是很成熟。
DirectX 5.0
不知道什么原因,微软的新版本并没有接着3.0称为DirectX 4.0,而是直接到了5.0。这一版本对Direct3D作了很大的改动,加入了雾化、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。同时,它在其它各组件方面也有加强,在声卡、游戏控制器方面均作了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。
DirectX 6.0
DirectX 6.0推出时,其最大的竞争对手之一Glide,已逐步走向了没落,而DirectX则得到了大多数厂商的认可。DirectX 6.0中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。
DirectX 7.0
其实,DirectX技术和显示卡功能的发展是相互促进的。DirectX 7.0最大的特色就是支持T&L(中文名称是“坐标转换和光源”)。3D游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换。3D游戏中除了场景、物体,还有灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。在DirectX 7.0出现以前,位置转换和灯光都需要CPU来计算,CPU速度越快,游戏表现越流畅。使用了T&L功能后,这两种效果的计算用显卡的GPU来计算,这样就可以把CPU从繁忙的劳动中解脱出来。
DirectX 8.0
DirectX 8.0的推出可以说又引发了一场显卡革命,它首次引入了“像素渲染”概念,同时具备像素渲染引擎(Pixel Shader,PS)与顶点渲染引擎(Vertex Shader,VS),反映在特效上就是动态光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。通过VS和PS的渲染,它可以很容易地构造出真实的水面动态波纹光影效果。
DirectX 9.0
2002年底,微软发布DirectX 9.0。DirectX 9.0主要包括两个版本:DirectX 9.0b和DirectX 9.0c。
DirectX 9.0b中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,有更多的常量,每个程序的着色指令增加到了1024条。但从本质意义上,9.0对8.0的架构并没有进行大的改变,它只是对像素渲染引擎与顶点渲染引擎的功能进行了加强。PS2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多。另外,PS1.x只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质。新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举地实现。VS2.0通过增加Vertex程序的灵活性,显著地提高了老版本(DirectX 8)的VS性能。新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。
与DirectX 9.0b和Sharder Model 2.0相比较,DirectX 9.0c最大的改进,便是引入了对Shader Model 3.0(包括Pixel Shader 3.0和Vertex Shader 3.0两个着色语言规范)的全面支持。举例来说,DirectX 9.0b的Shader Model 2.0所支持的Vertex Shader最大指令数仅为256个,Pixel Shader最大指令数只有96个,而在Shader Model 3.0中,Vertex Shader和Pixel Shader的最大指令数都大幅上升至65535个,全新的动态程序流控制、位移贴图、多渲染目标(MRT)、次表面散射(Subsurface scattering)、柔和阴影(Soft shadows)、环境和地面阴影(Environmental and ground shadows)、全局照明(Global illumination)等新技术特性,使得GeForce 6、GeForce 7系列以及Radeon X1000系列立即为新一代游戏以及具备无比真实感、幻想般的复杂的数字世界和逼真的角色在影视品质的环境中活动提供强大动力。
在DirectX 9.0c中,Shader Model 3.0除了取消指令数限制和加入位移贴图等新特性之外,更多的特性都是在解决游戏的执行效率和品质上下功夫。Shader Model 3.0诞生之后,人们对待游戏的态度也开始从过去单纯地追求速度,转变到游戏画质和运行速度两者兼顾。
DirectX 10
DirectX从开始流行,就一直被一个主要的问题所困扰,那就是高CPU负载。从技术角度,这种CPU负载给3D图像带来两个负面影响:首先,限制了画面中可以同时绘制的物体数量;其次,限制了可以在一个场景中使用的独立的特效的数量。这就使得游戏画面中的细节数量受到了很大的限制,而图像具有真实感的主要要求便是丰富的细节。
DirectX 10的主要优势便是更好、更合理地利用GPU资源,从而降低对CPU的依赖。它主要通过三个途径来达到这个目的:第一,修改API核心,使得绘制物体和切换材质特效时的消耗降低,提高绘图效率;第二,引入新的机制,降低图形运算操作对CPU的依赖性,使更多的运算在GPU中完成;第三,使大量的物体可以通过调用单条DirectX绘制命令进行批量绘制。此外,在DirectX 10中的Shader Model 4.0,引入新的Shader:Geometry shader这是可编程图形流水线的一大进步。它第一次允许由GPU来动态地生成和销毁几何图元数据。通过和新的数据流输出功能配合使用,许多以前无法实施的算法现在都可以在GPU中使用了。同时,vertex、geometry、pixel shader采用了统一的Shader架构。
DirectX 11
DirectX 11并不能算是一个全新的应用程序接口,而是DirectX 10的超集,简单的说DirectX 11就是基于DirectX 10/10.1开发出的技术,主要对DirectX 10和DirectX 10.1功能做出扩展和增强。
Tessellation带来了新的可编程和固定功能渲染流程,可为3D游戏和建模程序同时带来稳定的高帧率(速度)和表面效果。
Compute Shader是挖掘硬件计算能力的新途径,而且没有诸多限制,关键特性包括线程间数据通信、一整套随机访问和流式I/O操作基本单元等,能加快和简化图像和后期处理效果等已有技术,也为DX11级硬件的新技术做好了准备。