转自http://blog.csdn.net/zypsg/archive/2006/03/21/630806.aspx
[图形世界分裂的两派]
计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术,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专业显卡为例:
丽台Quadro4 550 XGL
随卡的说明书上标明“丽台Quadro4 550 XGL的产品特性:硬体叠覆平面、硬体防锯齿线条、双面投影、全景防锯齿、第二代闭塞选择、第二代光速记忆体架构、单一显示器支援 2048x1536、第二代nfiniteFX引擎、硬体支援Microsoft® DirectX® 8 和 OpenGL® 1.3。”很清楚,这是一块硬件支持DirectX 8和OpenGL 1.3的Quadro4核心的显卡,千万不要被JS的花言巧语蒙骗了。
让我们先选择一款现在最流行的《魔兽争霸III》游戏来试试D3D和OpenGL吧。《魔兽争霸III》是今年刚推出的全3D的游戏,《魔兽争霸III》默认启动DX8.1的D3D模式,但还有一种模式就是OpenGL的3D模式, 并不是暴雪公司不愿意设它为主要模式,而是OpenGL是属于专业三维,有一部分游戏显卡还不支持或不完全支持这个功能。要想打开OpenGL模式,我们需要编辑一下《魔兽争霸III》的快捷方式,在exe文件后面加上-opengl参数,再运行快捷方式进入游戏即可。要想返回D3D模式,也只要把-opengl参数去掉即可。
D3D截图
OpenGL截图
OpenGL模式与D3D模式相比,唯一比较明显的就是字体变得有些模糊。
D3D截图
OpenGL截图
从游戏截图中我们可以看到D3D和OpenGL模式下,游戏画面几乎没有任何区别。设计两个API的作用在于,在你的显卡运行某个API出现贴图错误或者或者运行速度跟不上时可以试着切换另一个API来纠正,据说在OpenGL运行《魔兽争霸III》并在控制面板中启用OpenGL的"MIP线性过滤功能"(MIP就是快速线性图像处理)可以提升游戏速度10%。
[再聊专业应用]
再来看看D3D和OpenGL在3DS MAX 5.0中的表现(使用显卡:Geforce3 Ti500)。
3D Studio MAX 5.0是Discreet公司今年6月份发布的最新三维动画创作软件。3DS MAX在全球有数以百万计的使用者,超过了其它几种主要3D动画软件的用户总数。同时,3DS MAX也是在专业软件中为用户考虑最多的软件之一,在它支持的图形标准上就可以看出这一点。3DS MAX共支持4种3D显示接口,分别是Heidi、OpenGL、Direct3D和 Custom。其中Heidi是由AutoDesk公司自己开发的3D API,缺省情况下采用软件方式进行3D模型的显示,虽然能够显示的效果有限,不过由于Heidi的效率出奇的高,因此它对于显卡硬件功能和性能较弱的用户来说还是不错的。OpenGL是目前主流的3D API,3DS MAX毫无保留的对此提供了支持。OpenGL效率很高,它可以很好的利用硬件性能(包括硬件T&L)来加速模型的显示。在DirectX 8未推出以前,OpenGL也是能够显示最多效果的3D API。在3DS MAX中,Direct3D过去主要是为了使不支持OpenGL的低端显卡能够用来对动画制作进行加速。不过,由于过去Direct3D的效率不高,功能有限,而且采用这种方案的用户也不多,因此长期以来没有得到足够的重视。直到支持DirectX 8的3DS MAX 4和Geforce3显卡的推出,才使这种情况发生了极大的变化。和之前的4.X系列不同的是,MAX 5.0已经把一些基本的硬件Vertex、Pixel Shader Plug-in默认地加载了,当采用Direct 3D驱动模式的时候,我们就能应用上硬件Shader带来的好处了。在3D Studio MAX 5.0目录的scenes、Version5Features、DirectXFeatures文件夹下有两个应用了DirectX 8特性的模型,它们利用了Pixel Shader的贴图,表现出了极其逼真的环境反射效果等(详见下图)。这样的实时渲染效果已经极其接近于最终的渲染效果,这是目前的标准OpenGL接口所做不到的。
如果你使用的是nVIDIA Quadro系列的显卡,也可以考虑用基于OpenGL的专业的MAXtreme来代替标准的OpenGL接口,与3DS MAX提供的标准OpenGL接口相比,MAXtreme能够提供更多的效果和更好的性能,如高质量透明度、真实感觉的雾化效果、各种纹理过滤方式等。另外,MAXtreme对于显示的加速作用是十分明显的,在MAXtreme中打开Triangle Strip选项可以使复杂线框模式下显示性能提高50%以上。
3DS MAX共支持4种3D显示接口,支持DirectX 8.1(配合Geforce3以上显卡)
3DS MAX 5.0的D3D和OpenGL设置窗口
biplane.max模型的DirectX 8和标准OpenGL的实时显示效果
TigerTank.max模型的DirectX 8实时显示效果
TigerTank.max模型的标准OpenGL实时显示效果
关于OpenGL和D3D的设置后的效果比较以及产生画质差异的原理分析:两大API各有自己的特性,有相同又有不同之处,就好像子集与交集。比如OpenGL 1.4的新功能包括深度纹理和阴影纹理,可以支持实时引擎和相关图象渲染技术,一个Vertex编程框架,支持用户定义几何,光照和阴影程序的阶段设置,支持高级一般应用Shading语言,支持自动纹理mipmap生成,同样的增强功能还包括多绘图阵列,Windows光栅定位,用户定义雾表坐标轴和第二个颜色,点参数,LOD等等功能,而DirectX 8.1也包括Vertex编程。有兴趣详细比较的朋友可以访问以下链接:
http://www.opengl.org/developers/documentation/OpenGL14.html
http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid=28000410
目前的两大主力娱乐级显卡厂商:nVIDIA的显示卡对两大API的兼容性都极佳,由于对OpenGL的支持过于优秀,nVIDIA甚至早就开始打入了专业显卡领域。ATi在收购了FireGL以后也开始涉足专业显卡。
从Geforce256开始,nVIDIA每推出一款图形芯片,都会针对主流市场和专业市场推出不同的产品:Geforce256/Geforce2/Geforce2 MX/Geforce2 Pro/Geforce3对应Quadro/Quadro2/Quadro2 MXR/Quadro2 Pro/Quadro DCC。以前nVIDIA的Quadro系列产品都是由德国的ELSA公司独家推出的。包括象ELSA Gloria DCC(NV20 Quadro DCC)、ELSA Gloria4(NV25)等产品。Geforce与Quadro和核心十分相近,一些硬件发烧友成功的将普通的Geforce显卡修改为昂贵的Quadro专业显卡。
但这并不意味着现在的专业三维图形卡与娱乐级显卡差别不大,它们还是有很大的区别的。
专业显卡需要的不仅仅是贴图和渲染速度,作为专业级的显卡,它必须具备如下几个特点:1、单位时间内处理三角形的能力要高;2、完善支持OpenGL;3、具备极高的稳定性和兼容性;4、3D处理流程的全硬件化;5、显寸尽可能大;6、价格较昂贵。在执行工业级应用程序时,设计人员绝对无法忍受任何不稳定、缺乏效率的绘图系统,在图像准确度与品质上也毫不妥协。专业图形加速卡的卖点恰恰不在于多边形产生速度或像素填图率等指标上,而是在调整驱动程序以及提供绘图的精确性方面。这也是为什么专业图形卡,特别是高端图形卡价位高得离谱的最主要原因。高档专业显卡的驱动程序往往都带有对所有OpenGL函数提供完善支持的OpenGL客户端驱动程序(ICD),这些优化程序使用其专业的接口,通过与专业软件的“无缝”结合,对提高机械CAD、建筑、动画、模拟等领域的工程师们的工作效率可以起到非常大的帮助。
目前的专业显卡市场上:3Dlabs WildCat系列、ATi FireGL4牢牢占领了高端图形卡市场;Elsa Gloria系列、ATi FireGL2在中端市场上占半壁江山(包括最新的Quadro4、Radeon 8800、FireGL X1);Elsa的Synergy系列以超低价格抢占了低端市场,与3Dlabs Oxygen VX1/GVX1打得不亦乐乎。
根据以上我们对各种3D API的了解,我们在进行电脑硬件系统配置时应该从应用重点出发选择显示卡。如果我们的电脑在PⅡ 233以上机型,平时又主要用于一般文字处理和游戏,或者也业余搞些3D图形制作等,那么可以选择支持Direct 3D和OpenGL两种3D API的AGP显示卡;如果你的电脑准备用于专业性的3D图形制作,那你必须考虑选择除了支持D3D和OpenGL外还支持MAXtreme、HeiDi的专业图形卡了。从实际应用情况看,对于大部分电脑业余爱好者只要选择能支持最常用的DirectX(Direct 3D)和OpenGL的3D显示卡就可以了。另外,我们在选择3D显示卡时,要注意对比新产品广告宣传中所列举的支持不同的3D API时的测试数据,同时注意所能支持的3D API类型和数量,具体到Direct 3D测试数据时还可以注意它究竟能支持多少项(D3D可以支持12种以上3D图形处理效果)D3D的功能。
当你看到一个陌生的3D游戏画面时,你能立刻看出它是基于D3D还是OpenGL的吗?或许John Carmack可以,但我想我们大多数人都不能。我们需要知道的是我的应用程序需要哪种3D API才能运行得更有效率,哪种3D API可以让我的游戏跑得更快更靓。