图形世界分裂的两派——理清Direct3D和OpenGL的脉络

计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术,API(Application Programming Interface)即“应用程序接口”是连接应用程序与操作系统、实现对计算机硬件控制的纽带,Direct3D和OpenGL是目前的两大3D图形 API,要在你的3D显卡上进行3D特效的制作、实现都必须通过它们(Vooodoo迷们肯定对Glide接口记忆尤深,可惜已随着3dfx的倒闭而作古,其它还有Heidi等接口)。关于D3D和OpenGL的理论知识可以写一大堆厚厚的书,在这里我只为大家简单介绍一下基础知识,有兴趣深入研究的朋友可以自己上网查询相关资料。

Direct3D(D3D)


Direct 3D是基于微软的通用对象模式COM(Common Object Mode)的3D图形API。它是由微软(Microsoft)一手树立的3D API规范,微软公司拥有该库版权,它所有的语法定义包含在微软提供的程序开发组件的帮助文件、源代码中。Direct3D是微软公司DirectX SDK集成开发包中的重要部分,适合多媒体、娱乐、即时3D动画等广泛和实用的3D图形计算。自1996年发布以来,Direct3D以其良好的硬件兼容性和友好的编程方式很快得到了广泛的认可,现在几乎所有的具有3D图形加速的主流显示卡都对Direct3D提供良好的支持。但它也有缺陷,由于是以 COM接口形式提供的,所以较为复杂,稳定性差,另外,目前只在Windows平台上可用。



作为微软DirectX技术的组件之一,Direct 3D也随着DirectX的升级而不断更新,同时在微软的全力扶植下,Direct 3D技术的发展速度极快,DirectX 7:正式支持硬件T&L(光影变换)、DirectX 8:对Pixel Shader(像素着色器)Vertex Shader(顶点着色器)的支持、DirectX 9:提供2.0版本的可编程顶点和像素着色模式,显卡硬件厂商也纷纷以对最新的D3D特效的硬件支持为卖点。遗憾的是,由于平台的局限性等原因,D3D应用至今仍主要集中于游戏和多媒体方面,专业高端绘图应用方面,老牌的3D API---OpenGL仍是主角。

OpenGL


OpenGL的英文全称是“Open Graphics Library”即“开放的图形程序接口”,它是计算机工业标准应用程序接口,主要用于定义二维三维图形。

OpenGL是一套底层三维图形API,之所以称之为底层API,是因为它没有提供几何实体图元,不能直接用以描述场景。但通过一些转换程序,可以很方便的将AutoCAD、3DS等图形设计软件制作的DFX和3DS模型文件转换成OpenGL的顶点数据。

OpenGL是与硬件无关的软件接口,使用它图形软件生产厂商再不用为各种不同的机型开发设计不同的软件,只要操作系统使用了OpenGL适配器就可以达到相同的效果,它是一个开放图形库,目前在Windows、MacOS、OS/2、Unix/X-Windows等系统下均可使用,且仅在窗口相关部分(系统相关)略有差异,因此具有良好的可移植性,同时调用方法简洁明了,深受好评,应用广泛。OpenGL能在网络环境下以客户机/服务器模式工作,充分发挥集群运算的威力,是专业图形处理、科学计算等高端应用领域的标准图形库。



将OpenGL称之为SGI的OpenGL毫不为过,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。SGI在1992年7月发布1.0版,后成为工业标准,由成立于1992年的独立财团OpenGL Architecture Review Board (ARB)控制。SGI等ARB成员以投票方式产生标准,并制成规范文档(Specification)公布,各软硬件厂商据此开发自己系统上的实现。只有通过了ARB规范全部测试的实现才能称为OpenGL,现在的ARB投票成员包括SGI、Intel、IBM、nVIDIA、ATi、 Microsoft、Apple等业界群英。2001年8月ARB批准了1.1版本,最新版规范是2002年7月24日通过的1.4版本。

看完了上面关于D3D和OpenGL的介绍,可能会给人这样一种印象:D3D和OpenGL井水不犯河水,一个定位于高端工业标准,一个定位于低端娱乐,互不相干,但其实它们暗底下早就已经开始在较劲了。

虽然早在WinNT 3.51 时代,Microsoft就已经实现了它的OpenGL 版本,但却不肯随其Windows95 提供,称该API 只适合高端应用,而Win95面向一般消费者,用不到。但后来大名鼎鼎的ID Software 的高手,DOOM、Quake之父John Carmack在开发下一代三维图形引擎时戏称Direct 3D为可怕的、支离破碎的API,并极力建议采用OpenGL,此后以他为代表的一大批游戏开发人员开始多方呼吁MS积极支持OpenGL。 Microsoft终于在Win95的OSR2版本里集成了OpenGL。

1999年SGI宣布与Microsoft合作开发Ferihant,即Windows的下一代图形处理体系,包括DirectX与OpenGL的低级图形处理接口和以场景图支持为特点的高级接口,并且就此停止对其在Windows下的OpenGL实现的支持以示决心。此举举世瞩目,大家都以为 Windows图形处理快要过上幸福生活了,然而,不久,SGI宣布中止合作,并撤回派出的科学家,Ferihant基本上夭折。SGI 称终止合作的原因是Microsoft不肯积极合作,光想把SGI 的技术合并进DirectX,真正内幕不详。不过以SGI在图形处理界的老大地位来说,还是有几分可信度的,因为Microsoft最初支持OpenGL 就不积极。



由于要考虑到团队中大多数人的利益,由ARB架构检查委员会维护的OpenGL总是停滞不前,唯一的进展仅是OpenGL扩展指令的推出。这些扩展指令是一些绘图功能,像是ClearCoat、Multisample、视频及绘图的整合工具(某些是通过OpenML的努力而开发出来的,它本身属于 OpenGL ARB扩展指令之一)。这正好给也是ARB成员之一的Microsoft找到了借口,他抱怨ARB对市场的反映极为迟钝,因而抛开OpenGL,顷其所有的开发资源,独自全力投入使DirectX成为高端绘图、与游戏开发API的工作上。

D3D和OpenGL的互相渗透也早已初露端倪,你可以在市面上看到不少采用OpenGL的游戏如QuakeIII、重返德军总部等等,也可以看到Direct 3D凭着自身的优势,在3DS Max上渐渐超越OpenGL,关于这方面具体的介绍会在文章后面部分讲到。

OpenGL与DirectX代表着绘图世界分裂的两派。
[它们如何工作?]

前面我们已经看到,由于种种原因,我们不得不接受两个3D API的现实。虽然如此,显卡对D3D和OpenGL的支持却不是分裂的,聪明的硬件厂商有办法让它的显示芯片很完美的同时提供对D3D和OpenGL的硬件支持。说到这里,我们不得不感谢nVIDIA,除了对D3D的支持,从它的Riva128芯片组开始,nVIDIA就提供对OpenGL的极佳的支持。现在,我们的主板上不必插上Direct3D和OpenGL两块显卡,也不必不时把VGA接口从一块显卡换到另一块显卡,能够避免这样恐怖的情景,这真是值得欣慰的。还记得吗?Voodoo让2D和Glide统一的方式是插两块显卡再用一根信号连接线将它们连起来。

游戏程序员们曾经对OpenGL的技术和画质推崇倍至,以至于微软被迫在Windows系统中引入OpenGL,并且在Windows平台上出现了 Quake II、QuakeIII、重返德军总部等一批优秀的基于OpenGL API的游戏,而同时期的D3D游戏没有哪一款能在画质上超越这些OpenGL游戏的,一直到微软发布DirectX 7,这种情况还是没有发生多大的改变,DirectX只是作为一个能用于快速开发游戏的API而存在着,但是当微软在2001年发布了DirectX 8以后,局面终于被扭转了,DirectX 8是DirectX发展史上一个里程碑式的产品,它在2D、3D、视频、音频以及交互式输入设备接口方面进行了许多重要的改进,其中,在3D图形处理方面尤其做了划时代的改进,可以说,作为一个游戏API,D3D 8已经超越了OpenGL。出现这样的情况决非偶然:OpenGL是由ARB这一官僚机构管理的,官僚主义带来的自然是OpenGL发展的停滞不前,以至于在OpenGL 1.0推出后的相当长的一段时间里,OpenGL唯一做的只是增加了一些扩展指令集,可笑的是最新的OpenGL 1.4中的一项Vertex编程框架技术还被同为ARB成员之一的微软指控侵犯了DirectX 8的专利;而Direct3D这边却得到了微软倾尽全力支持,技术更新极快。不超越OpenGL才怪呢。

DirectX 7在处理3D的时候是遵循一种传统的方式:

CPU顶点数据---〉 T&L引擎---〉裁减/三角形设置/光栅化---〉多纹理混合处理---〉雾混合---〉透明度/模板和深度测试---〉帧缓冲

上面是传统(如DirectX 7和OpenGL 1.2)3D图形处理流水线的情况,虽然这种架构在多年的实践中被证明是一种高效率的3D图形处理方式,在硬件上容易实现,编程也相对简单。但是采用这种方式,软件开发人员不可能干预3D图形处理的过程,他们惟一要做的工作就是将硬件支持的各种效果事先规划好,再送入3D流水线进行处理。3D图形处理器所能完成的工作在硬件设计好以后就不能被改变了。可以说这种结构在很大程度上制约了软件开发者的想象力和创造力。而DirectX 8在传统3D图形处理流水线中的两个地方进行了改进,增加了“可编程”特性:

CPU顶点数据---〉 Vertex Shader、T&L引擎---〉裁减/三角形设置/光栅化---〉Pixel Shader、多纹理混合处理---〉雾混合---〉透明度/模板和深度测试---〉帧缓冲

上面就是DirectX 8可编程3D图形处理流水线的示意图。与过去的处理方式相比,DirectX 8对两个部分进行了改进:一个可编程的Vertex Shader(顶点着色引擎)代替了过去的几何变换和光源处理(T&L)引擎;而可编程的Pixel Shader(像素着色引擎)则加入了过去的纹理处理流水线。

当然未来的走向还有可能变化。采用像素着色与顶点着色的缺点,在于并无标准的可编程能力供绘图硬件之用,以至于DirectX 9未正式出现之前,两大GPU制造商Nvidia与ATI在DirectX的运用上已经分道扬镳了,这可能会对Direct3D产生不利的局面。 OpenGL则不甘示弱,即将出台的OpenGL 2.0会试图将稳定性及开放标准,带至可编程绘图及GPU上,很可能再次全面超越DirectX。一些人怀疑Microsoft声称拥有OpenGL 2.0部分功能专利权,OpenGL 2.0将是OpenGL下一个重要修正版。

毫无疑问,目前的市场上,娱乐级的3D显卡竞争是最激烈的,目前能够完全硬件支持DirectX 8的显卡主要有:nVIDIA的Geforce3以上、ATi的Radeon8500以上级别的显卡以及SiS的Xabre、Matrox Parhelia-512等其它厂商的显卡。而考虑到性价比等因素,只有nVIDIA、ATi两大显卡领域的领头羊是最佳选择。要想发挥nVIDIA、 ATi的3D性能,用好它们的驱动程序也是极其重要的,关于nVIDIA、ATi驱动程序版本及D3D、OpenGL支持情况、设置界面我们会在后面的应用篇讲到。
[细谈D3D、OpenGL]

如果你对各显卡硬件厂商系列显卡的发展史知之甚少,识别一块显卡对D3D和OpenGL的支持情况,最直接的方法就是看它的规格说明。

以这块丽台Quadro4 550 XGL专业显卡为例:

你可能感兴趣的:(人工智能,c/c++,数据库)