Windows上的OpenGL

来源:互联网 发布:CAD合并软件 编辑:程序博客网 时间:2024/04/28 01:10

第19章 Wiggle: Windows上的OpenGL

19.1  Windows上的OpenGL实现

OpenGL进入Win32平台是在Windows NT 3.5发布之后。它是作为Windows 95的一种增强功能稍后发布的,随后成为Windows 95 操作系统(OSR2)的一部分。现在,OpenGL在所有的Win32平台(Windows 95/98/ME,Windows NT/2000/XP和Vista)上都是一种原生API,它的功能是从opengl32.dll导出的。我们需要注意OpenGL在Windows平台上具有4种变型:通用、ICD、MCD、 扩展。无论从用户还是开发人员的角度,它们都各有优劣。对于这些实现是如何工作的,以及它们可能存在的缺陷,至少需要在高层上对它们有一个基本的理解。

19.1.1 通用OpenGL

OpenGL的通用实现是一种软件实现,并没有使用特殊的3D硬件。Microsoft随Windows所附带的OpenGL实现就是一种通用实现。硅谷图形公司(SGI)为Windows所提供的OpenGL实现(现在不再广泛使用)可以选择利用MMX指令,但后者并不被认为是一种专用的3D硬件,因此它仍然被认为是一种通用软件实现。另一种称为“MESA(www.mesa3d.org)”的实现严格地说不是一种“真正”的OpenGL实现,而是一种模拟。但是,在绝大多数情况下,我们可以把它当成是一种OpenGL实现。MESA也可以固定到硬件上,但这只是在一种特殊的情况下(Mini驱动程序,将在稍后讨论)。

尽管MESA实现近几年来一直紧随OpenGL逐渐增加的特性,但Microsoft的OpenGL实现在1.1版本之后便再也没有进行过更新。读者不必担心,我们很快将展示如何获得自己的图形卡所支持的OpenGL功能。

19.1.2  可安装客户驱动程序

可安装客户驱动程序(ICD)是为Windows NT所提供的最初硬件驱动程序。ICD必须用软件和它所针对的特殊硬件一起实现完整的OpenGL管线。对于厂商而言,从头开始创建一个ICD具有相当大的工作量。

ICD可与Microsoft的OpenGL实现协同工作。链接到opengl32.dll的应用程序自动包含了ICD驱动程序代码,可以进行OpenGL调用。这种机制是非常理想的,因为这样一些,一旦出现一种可用的OpenGL硬件,应用程序不再进行重新编译就可以利用它的功能。ICD实际上是显示驱动程序的一部分,它并不会影响原有的opengl32.dll系统DLL。这个驱动程序模型向厂商提供了最佳的机会,允许他们对自己的驱动程序和硬件组合进行优化。

19.1.3  迷你客户驱动程序

迷你客户驱动程序(MCD)是软件和硬件实现之间实现的一种折中;大多数早期的PC 3D 硬件只对光栅化阶段提供硬件加速(参见第二章“使用OpenGL”的“管线”一节)。MCD驱动程序模型允许应用程序使用Microsoft的通用实现,用于那些尚无法用硬件实现的特性。例如,转换和光照可以用Microsoft的OpenGL软件实现完成,而光照着色三角形的实际光栅化则由硬件来处理。

MCD驱动程序实现使硬件厂商更易于为它们的硬件创建OpenGL驱动程序。其中绝大部分工作由Microsoft完成的,厂商在硬件中所实现的特性被递交给Microsoft的通用实现。

MCD驱动程序模型使OpenGL迈入PC这个巨大市场的前景变得光明。各个厂商可以使用一种最初用于Windows NT的软件开发工具箱(SDK)为Windows 95创建MCD驱动程序。在许多硬件厂商完成了它们的MCD驱动程序之后, Microsoft决定不再向这些代码提供公共发布许可。这使得他们自己的专用3D API 在消费者市场暂时占据了优势。

现在,MCD驱动程序模型在很大程度上已经过时,但是有一些OpenGL实现任然在使用它。MCD驱动程序模型逐渐消亡的其中一个原因是它不能有效地支持Intel的加速图形端口(AGP)的纹理功能。另一个原因是SGI开始向硬件厂商提供一种优化的ICD驱动程序工具,使得ICD驱动程序的编写几乎像MCD一样容易(这是对Microsoft临时撤回在Windows 95 上对OpenGL的支持所作出的反应)。

19.1.4  Mini驱动程序

Mini驱动程序并不是一种真正的显示驱动程序。反之,它是opengl32.dll的替代品,用于调用硬件厂商私有的3D 硬件驱动程序。在一般情况下,这些Mini驱动程序把OpenGL调用转换为大致等价的硬件厂商专用3D API 调用。第一个Mini驱动程序是由3Dfx为它的Voodoo图形卡所编写的。这个DLL替代品把OpenGL调用转换为Voodoo的本地Glide(3Dfx的3D API)编程接口。

尽管Mini驱动程序使OpenGL开始在游戏领域流行,但它常常会损失一些OpenGL功能或特性。并不是所有使用OpenGL的应用程序都能够在Mini驱动程序下工作。在一般情况下,这些驱动程序只提供了运行一种流行游戏所需要的最基本功能。尽管并没有进行广泛的宣传,但Microsoft为OpenGL创建了一个D3D转换层,可以再Windows XP上使用,并不存在ICD时可以对一个游戏进行加速。幸运的是,OpenGL的广泛流行使这些Mini驱动程序在更新的商业PC中变得过时。

19.1.5  Vista上的OpenGL

Windows Vista上有一种Mini驱动程序的变型,但它并未对开发人员开放。Microsoft实现了一种OpenGL to D3D模拟器,支持OpenGL版本1.4.这个实现看上去与ICD相似,但是只有当真正的ICD不存在时才被使用。在Vista的初始版本中,没有办法手工切换到这个实现。只有一些游戏(Microsoft所选择)有办法看到这个实现。和XP一样,Vista并没有在发行介质上附带ICD驱动程序。但是,当用户从厂商的网站上下载了一个新的驱动程序之后,就可以得到一个真正的基于ICD的驱动程序,并且它对基于窗口的游戏和全屏游戏都提供了OpenGL支持。

19.1.6  扩展OpenGL

如果我们所开发的软件需要用于所有版本的Microsoft Windows,可以利用头文件和一个可以用于Microsoft的opengl32.dll的导入函数库。这个DLL的目的就是在未安装3D硬件时可以返回到通用实现(软件渲染),并作为一种发送机制,与官方的OpenGL驱动程序模型一起工作,使用基于硬件的OpenGL实现。这种使用头文件和导入函数库的方法只能使我们使用OpenGL1.1所提供的函数和功能。

到这个版本时,大多数桌面驱动程序都支持OpenGL版本2.1。但是,OpenGL1.1仍然是一种功能强大、特性完整的图形API,适合于范围极广的图形应用程序,包括游戏和商业应用程序。即使没有OpenGL1.2和以后版本的附加功能,图形硬件的性能仍然得到了极大的增强,绝大多数PC图形卡使用特殊目的的硬件实现了完整的OpenGL管线功能。OpenGL1.1仍然能够极其快速和高度复杂的3D渲染功能!

许多应用程序仍然需要一些更新的OpenGL特性,至少能够借助这些新特性显著地提高性能。为了使用更新的OpenGL特性(它们都受到了广泛的支持),需要使用的机制与厂商特定的OpenGL增强所使用的机制相同。我们在第二章介绍了OpenGL的扩展机制,在Windows上使用这种扩展机制的特定说明则出现在本章后面“OpenGL和WGL扩展”这一节中。

听上去,这似乎是一种令人颇感困惑的3D图形开发环境,特别是当我们计划把应用程序移植到像Macintosh这样的平台上。在Macintosh平台上,OpenGL特性的更新更为常见,在每个版本的OS发布时都会有更新。但是,我们可以使用一些策略,使开发工作更易于管理。首先,我们可以调用下面这个函数,这样应用程序就可以再运行时得知硬件驱动程序所支持的OpenGL版本。

glGetString(GL_VERSION);

按照这种方法,我们可以轻松地判断应用程序是否能够在用户的系统上运行。由于OpenGL及其扩展是动态加载的,因此应用程序至少能够启动,并向用户显示一条友好的错误信息或诊断信息。

我们还需要仔细考虑应用程序“必须”具有的OpenGL特性。应用程序在编写时是否只使用OpenGL1.1特性?如果没有特殊硬件的支持,用户必须使用内置的软件渲染器,这个程序是否仍然能够运行?如果这两个问题的答案都是肯定的,那么首先应该只使用OpenGL1.1的导入函数库编写应用程序的渲染代码。这样,我们的应用程序就具有最广泛的可用性。

在编写了基本的渲染代码之后,可以回过头来考虑利用更新的OpenGL特性,对应用程序进行性能优化或实现一些特殊视觉效果。如果能够尽早在程序中检查OpenGL版本,就可以引入不同的渲染路径或函数,使应用程序具有更加的性能,或者在渲染过程中增加额外的视觉效果。例如,静态纹理贴图可以用片断程序代替,标准雾效果可以由顶点程序所实现的容积雾代替。使用最新和最强的特性,确实可以让自己的程序更加光彩夺目。但是,如果过于依赖它们,程序所支持的用户可能会受到严重的限制,它的销售自然也难以让人满意。

记住,前面这些建议很大程度上取决于应用程序的类型。如果所开发的是逼真、高速的3D游戏,担心OpenGL1.1的用户就显得没有道理。另一方面,交互性的气象地图程序在开发时就应该采取较保守的策略。

有时候,应用程序必须具有一些新的OpenGL特性。例如,一种医学可视化软件包可能要求使用3D纹理或图像子集。在这种类型的更为专业会纵向的市场中,应用程序必须具备一些最基本的OpenGL支持才能运行。在这种情况下,它所要求的OpenGL版本将会列在最低系统需求中,这是我们需要为自己的软件所指定的。同样,应用程序可以在启动时检查这些细节。

  

 

原创粉丝点击