图形学也称计算机图形学,它是研究图形的输入、模型(图形对象)的构造和表示、图形数据库 管理、图形数据通信、图形的操作、图形数据的分析,以及如何以图形信息为媒介实现人机交 互作用的方法、技术和应用的一门学科。它包括图形系统硬件(图形输入-输出设备、图形工作 站)图形软件、算法和应用等几个方面。
图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、 曲线曲面造型、实体造型、真实感图形计算与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。
1950 年,第一台图形显示器作为美国麻省理工学院(MIT)旋风 I 号(Whirlwind I)计算 机的附件诞生了。该显示器用一个类似于示波器的阴极射线管(CRT)来显示一些简单的图形。计算机图形学处于准备和酝酿时期,并称之为:“被动式”图形学。到 50 年代末期,MIT 的林 肯实验室在“旋风”计算机上开发 SAGE 空中防御体系,第一次使用了具有指挥和控制功能的CRT 显示器,操作者可以用笔在屏幕上指出被确定的目标。与此同时,类似的技术在设计和生产过程中也陆续得到了应用,它预示着交互式计算机图形学的诞生。
1962 年,MIT 林肯实验室的 Ivan E.Sutherland 发表了一篇题为“Sketchpad:一个人机交 互通信的图形系统”的博士论文,他在论文中首次使用了计算机图形学“Computer Graphics” 这个术语,证明了交互计算机图形学是一个可行的、有用的研究领域,从而确定了计算机图形学作为一个崭新的科学分支的独立地位。
70 年代是计算机图形学发展过程中一个重要的历史时期。由于光栅显示器的产生,在 60年代就已萌芽的光栅图形学算法,迅速发展起来,区域填充、裁剪、消隐等基本图形概念、及其相应算法纷纷诞生,图形学进入了第一个兴盛的时期,并开始出现实用的 CAD 图形系统。 又因为通用、与设备无关的图形软件的发展,图形软件功能的标准化问题被提了出来。1974年,美国国家标准化局(ANSI)在 ACM SIGGRAPH 的一个与“与机器无关的图形技术”的工作 会议上,提出了制定有关标准的基本规则。此后 ACM 专门成立了一个图形标准化委员会,开 始制定有关标准。该委员会于 1977、1979 年先后制定和修改了“核心图形系统”(Core GraphicsSystem)。ISO 随后又发布了计算机图形接口 CGI(Computer Graphics Interface)、计算机图形元文 件标准 CGM(Computer Graphics Metafile)、计算机图形核心系统 GKS(Graphics Kernel system)、 面向程序员的层次交互图形标准 PHIGS(Programmer's Hierarchical Interactive Graphics Standard) 等。这些标准的制定,为计算机图形学的推广、应用、资源信息共享,起到了重要作用。
70 年代,计算机图形学另外两个重要进展是真实感图形学和实体造型技术的产生。1970 年 Bouknight 提出了第一个光反射模型,1971 年 Gourand 提出“漫反射模型+插值”的思想, 被称为 Gourand 明暗处理。1975 年 Phong 提出了著名的简单光照模型-Phong 模型。这些可以 算是真实感图形学最早的开创性工作。另外,从 1973 年开始,相继出现了英国剑桥大学CAD 小组的 Build 系统、美国罗彻斯特大学的 PADL-1 系统等实体造型系统。
1980 年 Whitted 提出了一个光透视模型-Whitted 模型,并第一次给出光线跟踪算法的范例, 实现 Whitted 模型;1984 年,美国 Cornell 大学和日本广岛大学的学者分别将热辐射工程中的辐射度方法引入到计算机图形学中,用辐射度方法成功地模拟了理想漫反射表面间的多重漫反射效果;光线跟踪算法和辐射度算法的提出,标志着真实感图形的显示算法已逐渐成熟。从80 年代中期以来,超大规模集成电路的发展,为图形学的飞速发展奠定了物质基础。计算机的运算能力的提高,图形处理速度的加快,使得图形学的各个研究方向得到充分发展,图形学 已广泛应用于动画、科学计算可视化、CAD/CAM、影视娱乐等各个领域。
最后,我们以 SIGGRAPH 会议的情况,来结束计算机图形学的历史回顾。ACM SIGGRAPH会议是计算机图形学最权威的国际会议,每年在美国召开,参加会议的人在 50,000 人左右。 世界上没有第二个领域每年召开如此规模巨大的专业会议,SIGGRAPH 会议很大程度上促进了图形学的发展。SIGGRAPH 会议是由 Brown 大学教授 Andries van Dam (Andy) 和 IBM 公司 Sam Matsa 在 60 年代中期发起的,全称是“the Special Interest Group on Computer Graphics and Interactive Techniques”。1974 年,在Colorado 大学召开了第一届 SIGGRAPH 年会,并取得了巨 大的成功,当时大约有 600 位来自世界各地的专家参加了会议。到了 1997 年,参加会议的人 数已经增加到 48,700。因为每年只录取大约 50 篇论文,在 Computer Graphics 杂志上发表,因 此论文的学术水平较高,基本上代表了图形学的主流方向。
不论是哪一种类型的图形芯片,总会支持某个版本的 DirectX 或 OpenGL API,而支持哪一 个 API 版本几乎成为图形产品分代的标志。我们有必要先明确 API 的概念,API 的全称是 “Application Programming Interface”,意为应用程序接口,它是连接应用程序、操作系统和底 层硬件的纽带。通俗点说,API 就是软件函数的集合,这些预先编写好的函数可以对硬件进行 直接控制,它最大的优点就是通用性。3D 显卡刚刚诞生时,并不存在支持何种 API 的概念, 如果某款游戏要运行在不同的显卡平台上,开发商就必须为每个类别的显卡编写一套程序,显 然这意味着巨大的精力损耗,同时也无法获得令人满意的效果。因此早期显卡通常都有“游戏 兼容性”的说法,游戏产品同样也有“显卡兼容性”的概念,这有点类似于上世纪 80 年代之 前的专用计算机时代:每个硬件平台都必须使用专用的软件、不同厂商之间软硬件不具通用性。
人们很早就意识到这个问题,对应的解决方案也被提出:制定一套操控硬件的图形函数库, 图形芯片制造商和游戏开发商都严格遵循这套标准,这样,图形芯片制造商无需考虑什么游戏 兼容的问题,它只要根据函数库提供的功能来开发产品就可以了;而游戏开发商也不必为每款显卡都编程、只要直接调用这些标准化的函数库即可实现广泛的兼容性。这套函数库也就是所 谓的图形 API。
目前,我们可接触到的图形 API 可分为 OpenGL 和 DirectX 两大体系,前者是一项开放性的标准、主攻专业图形应用和 3D 游戏,由“OpenGL 架构委员会”掌控,其成员包括业内各大 厂商,目前主要推动标准发展的实际领导者是 3Dlabs。DirectX 则是微软制定的 API 标准,除了图形 API功能外,它还包含音频 API等功能,只不过其图形部分升级最快、也最为人所知。DirectX 针对的主要是娱乐应用,截至 2008 年 6 月最新的 DirectX 10.1 API 功能极为强劲,大部分新 3D 游戏都基于 DirectX 10,而图形芯片制造商更是将它作为标准、竞相提供对DirectX 10.1 的支持, 是否支持 DirectX 10.1 也成为 2008 年两代显卡的分水岭。
对显卡来说,API 的重要性毋庸置疑,而未来每一次图形技术的重大进步都将与 API 紧密相关,关注 OpenGL 和 DirectX 这两种 API 无疑是非常必要的,从中我们可以了解它们的历史、现状和未来的发展,借机了解整个图形技术的发展状况。
OpenGL 与 DirectX 发布时间表
应用程序接口标准 OpenGL 与 DirectX |
|||
时间 |
微软 Windows 操作系统 个人版本发布 |
微软 DirectX 版本发布 |
OpenGL 版本发布 |
1992 年 7 月 |
|
|
OpenGL 1.0 |
1993 |
|
|
|
1994 |
|
|
|
1995 年 |
Windows 95 |
DirectX 1 |
OpenGL 1.1 |
1996 年 |
|
DirectX 2 |
|
1997 年 |
|
DirectX 3
DirectX 5 |
|
1998 年 |
Windows 98 |
DirectX 6 |
|
1999 年 |
|
DirectX 7 |
OpenGL 1.2 |
2000 年 |
Windows 2000
Windows Me |
DirectX 8.0 |
|
2001 年 2001 年 8 月 |
Windows XP |
DirectX 8.1 |
OpenGL 1.3 |
2002 |
Windows XP SP1 |
DirectX 9.0a |
OpenGL 1.4 |
2003 |
|
DirectX 9.0b |
OpenGL 1.5 |
2004 |
Windows XP SP2 |
DirectX 9.0c |
OpenGL 2.0 |
2005 |
|
|
|
2006 年 8 月 |
|
|
OpenGL 2.1 |
2007 |
Windows Vista |
DirectX 10 |
|
2008 |
WindowsVista SP1 |
DirectX 10.1 |
|
3D 图形芯片与 OpenGL、DirectX
3D 图形芯片与 OpenGL、DirectX |
||
时间 |
图形芯片厂商 Nvidia |
图形芯片厂商 ATI |
1996 |
NV2(NO、NO)失败产品 |
3D Rage 2(Direct3D、NO) |
1997 |
NV3 Riva 128(DirectX 5.0、OpenGL) |
3D Rage Pro(DirectX 6.0、NO) |
1998 |
NV4 Riva TNT(DirectX 6.0、OpenGL 1.2) |
Rage 128(DirectX 6.0、OpenGL 1) |
1999 |
NV5 TNT2(DirectX 6.0、OpenGL 1.2) NV10 GeForce256(DirectX 7.0、OpenGL 1.2)首款 GPU 诞生 |
|
2000 |
NV11 GeForce2(DirectX 7.0、OpenGL 1.2) |
R100 Radeon256(DirectX 7.0、OpenGL 1.3) |
2001 |
NV20 GeForce3(DirectX 8.0、OpenGL 1.3) |
R200 Radeon8500(DirectX8.1、OpenGL 1.4) |
2002 |
NV25 GeForce4(DirectX 8.0、OpenGL 1.3) NV30 GeForce5(DirectX 9、OpenGL 1.4) |
R300 Radeon9700(DirectX9.0、OpenGL 2.0) |
2004 |
NV40 GeForce6(DirectX 9.0c、OpenGL 1.5) |
R420 Radeon X800 ( DirectX9.0b 、 OpenGL2.0) |
2005 |
G70 GeForce7(DirectX 9.0c、OpenGL 2.0) |
R520 Radeon X1000 ( DirectX 9.0c 、 OpenGL 2.0) |
2007 |
G80 GeForce8(DirectX 10、OpenGL 2.0) |
R600 Radeon HD2000(DirectX 10、OpenGL 2.0) |
2008 |
G90 GeForce9(DirectX 10、OpenGL 2.1) |
RV670 Radeon HD3000(DirectX 10.1、 OpenGL 2.0) |
http://en.wikipedia.org/wiki/GeForce
http://en.wikipedia.org/wiki/Radeon
OpenGL 的英文全称是“Open GraphicsLibrary”,意为“开放的图形程序接口”。OpenGL 的历史可以追溯到上个世纪 90 年代初,标准诞生之后它一直占据主导地位。目前,随着微软 的 DirectX 的不断发展和完善,OpenGL 的优势逐渐丧失,未来的OpenGL 发展前景迷茫。
上个世纪 90 年代初,SGI 公司出于制造图形工作站产品的需要、开发出名为“IRISGL”的 图形 API 并成为工业标准。在当时,IRISGL 的功能可谓十分强大,但它的可移植性却相当之差。
有鉴于此,SGI 决定在 IRISGL 基础上开发出一种功能类似、但可移植性更好的图形 API—这就是 OpenGL。OpenGL 被打造为开放性标准,任何软硬件厂商均可自由使用,这让它受到广泛的 欢迎。
1992 年 7 月,SGI 正式发布 OpenGL 1.0 标准。OpenGL 1.0 完全实现了 SGI 的预期设计目标: 功能强大、移植性良好并能自由使用。随后,SGI 发起成立了“OpenGL 架构委员会”(OpenGLArchitecture Review Board,简称 ARB)来共同管理和推广这项先进的标准,OpenGL 后继标准 的制定权也逐渐转移给 ARB 组织。在 ARB 内部,产生新标准的过程非常民主化:各成员以投 票的方式来决定新版 OpenGL 标准应具有的功能特性,并据投票结果制作正式标准文档,各软 硬件厂商再根据这份标准文档的内容在自己的系统上实现;而所有的 OpenGL 版本都必须通过 文档规定的全部测试项目方能生效。ARB 组织的成员都非泛泛之辈,目前其核心成员包括 SGI、3Dlabs、Intel、IBM、nVIDIA、ATi、Microsoft、Apple 等业界领袖。
OpenGL 1.0 获得意料之中的巨大成功,专业图形领域唯它马首是瞻。看到这一点,微软甚为心动,当时它正在开发的 Windows NT 系统如果获得 OpenGL 的支持无疑会如虎添翼;而 SGI 也希望能够让OpenGL 广为流传。于是 SGI 和微软进行首次合作、联手将 OpenGL 1.0移植到Windows NT 平台。这项工作自然没有什么悬念,适用于 NT 的 OpenGL 1.0 顺利推出,这使得 Windows NT 系统成为图形工作站的又一个可选操作平台,很多运行于 UNIX 之下的专业图形软 件也逐渐被移植,微软和 SGI 都如愿以偿。
1995 年,SGI 推出了更为完善的 OpenGL 1.1 版本。OpenGL 1.1 的性能比 1.0 版提高甚多, 同时还加入了诸如顶点数组、顶点位置、新纹理等新特性,并增强了元文件对OpenGL 的调用 等等。OpenGL 1.1 同样获得了成功,而它也有对应的 Windows NT 版本。
1997 年,受 3D 显卡的刺激,Windows 95 平台下开始涌现出大量的 3D 游戏,可微软自己的 Direct 3D 3.0 图形接口极为糟糕,idSoftware 公司的顶尖程序员 John Carmack(Quake 之父) 嘲讽它简直就是“支离破碎的 API”。很自然,强大的 OpenGL 成为取代 DirectX 的最佳选择。但问题是微软虽然在 NT 系统中引入了 OpenGL,但其同时代的 Windows 95 却无法支持 OpenGL,面对这种局面,idSoftware 公司联合其它游戏开发商强烈要求微软在 Windows 95 中也引入OpenGL API,微软也很了解自己“Direct 3D 3.0”是什么货色、它很快就接受了这项建议。 而后,id 公司开发出基于 OpenGL 的 Quake2,想必有过 3 年以上游戏玩龄的读者都会记得 Quake2 那无以伦比的 3D 场景和激烈刺激的竞技画面。而 OpenGL API 因此立下大功,几乎所有游戏开发商都转向 OpenGL,微软后来也不得不顺应潮流、在 Windows95 OSR2 版及 Windows 98 中正 式支持 OpenGL,相关游戏开始大量涌现,而 AutoCAD、3DS MAX、Maya 等许多专业 3D 设计 软件也被移植到普通 PC 平台。今天,预算有限的设计者可以在 PC 中运行这些软件,莫不拜 OpenGL 所赐。
1999 年,OpenGL 再度发生变革,但这次它遇到的是发展史上的重大危机:SGI 决定与微 软联手开发下一代图形接口——Ferihant。Ferihant 应用于 Windows 系统中,作为 OpenGL 和 DirectX 的取代者。为此,Ferihant 将包含 DirectX 与 OpenGL 各自的优点,并加入场景贴图之类 的高级功能。由于有了 Ferihant,SGI 停止了原先的 Windows 版 OpenGL 开发计划,外界对此 表示赞赏。然而 Ferihant 计划没进行多久,双方的合作就出现裂痕,微软不积极合作,光想把SGI 的图形技术并入 DirectX 的做法令 SGI 非常不满,SGI 随后宣布中止合作并撤回所有的开发 人员,Ferihant 遂告夭折。在这之后,OpenGL 和 DirectX 似乎互不相干,继续在 PC 平台上发 展,但状况对比鲜明:DirectX 从此突飞猛进,而 OpenGL 却长期原地徘徊。
2001 年 8 月,ARB 发布 OpenGL 1.3 规范,它增加了立方纹理贴图、纹理环境、多重采样、纹理框架压缩等扩展指令,但是改进程度非常有限;2002 年 7 月,ARB 正式发布 OpenGL 1.4, 它也只加入了深度纹理/阴影纹理、顶点设计框架、自动纹理贴图等简单的功能,越来越落后 于图形硬件技术的飞速发展。而此期间DirectX 突飞猛进,DirectX 8 API 更是正式成为娱乐显卡 的标准,id 公司所形容的“支离破碎的 DirectX”早已非吴下阿蒙,大量的 3D 游戏转向了 DirectX体系。
OpenGL 落后于时代并非 ARB 组织技术不佳,根本症结在于确定 OpenGL 标准的民主机制:
各成员通过投票表决。在实际操作中,这些成员往往基于自身利益而产生意见分歧,为了照顾多数人的利益 OpenGL 不得不变得复杂臃肿、开发进度缓慢。我们可以看到,在 OpenGL 1.0 之后的各个版本只是进行一些扩展指令集的升级,而它对显卡硬件中不断涌现出的先进特性熟 视无睹,同为 ARB 成员之一的微软对此抱怨不已,后来它干脆彻底抛开 OpenGL、将全部精力 投到自家的DirectX。大获成功的 DirectX 7、DirectX 8 就是在此种背景下出现的。
2003 年的 7 月,ARB 公布 OpenGL 1.5 规范。OpenGL 1.5 内包含 ARB 制定的“正式扩展规格绘制语言”(OpenGL Shading Language v1.0),该语言用于着色对象、顶点着色、片断着色等扩展功能,同时也将作为下一代 OpenGL 2.0 版本的内核。OpenGL 1.5 的变化还增加了顶点缓 冲对象(可提高透视性能)、非乘方纹理(可提高纹理内存的使用效率)以及阴影功能、隐蔽查询 功能等等。
OpenGL 1.0 推出后的相当长的一段时间里,OpenGL 唯一做的只是增加了一些扩展指令集,这些扩展指令是一些绘图功能,像是 ClearCoat、Multisample、视频及绘图的整合工具(某些是 通过 OpenML 的努力而开发出来的,它本身属于 OpenGL ARB 扩展指令之一。为了一举改变 OpenGL 落后的状况,3Dlabs 协同其他 ARB 成员制定了雄心勃勃的 OpenGL 2.0 开发计划。
OpenGL 2.0 在 OpenGL 1.3 基础上进行修改扩充、但它有下面五个方面的重大改进:①复杂 的核心被彻底精简;②完全的硬件可编程能力;③改进的内存管理机制、支持高级像素处理;④扩展至数字媒体领域,使之跨越高端图形和多媒体范畴;⑤支持嵌入式图形应用。为了在获得强大功能的同时保持理想的兼容性,OpenGL 2.0 经历以下两个发展阶段:第一个阶段注重兼容能力和平滑过渡,为此,OpenGL 2.0 核心将在精简后的 OpenGL 1.3 功能模块的基础上加上可完全兼容的新功能共同组成,这种做法在满足兼容性的同时,还可将原有 OpenGL 中数量众多、且相互纠缠不清的扩展指令进行彻底精简。 第一阶段的任务只是为了过 渡,而第二阶段才是 OpenGL 2.0 的真正成熟期。此时,ARB 将合成出一个“纯 OpenGL 2.0” 内核,纯内核将包含更多新增加的“精简型 API 函数”,这些函数具有完全的可编程特性、结构简单高效、功能强大且应用灵活。除了完成这项任务外,ARB 组织还得指导开发商抛弃繁琐的 OpenGL 1.X、转用更具弹性的“纯 OpenGL 2.0”。
OpenGL version 2.1 在 2006 年 8 月 2 日发布,是最初版本 1.0 后的第七个版本。尽管增加 了版本的层析,支持高层析的编程shaders,但版本能够适于早期的版本,意味着运行 2.0, 1.5, 1.4,1.3, 1.2, 1.1, or 1.0 GL 的程序不用任何改变就可运行。
OpenGL2.1 与当前的 2.0 版本相比,虽然版本号变更不如DX9 到 DX10 那么巨大,但它却 增加了多项实用的技术和功能,例如向后兼容增强型 OpenGL 的先进管道规划,其中包括:优 化 GPU 和显存之间并行工作时间,提高象素缓冲和对象的象素和质感快速缓冲利用率;增加 标准彩色图像质感 sRGB 色彩空间应用促进管理的灵活性;并增加了许多新的 shader 弹性调配, 包括非平方矩阵支持,支持阵列流对象和碎块点位置时,干扰和 shaders 属性不变的变量 shader 代码提高可靠性。 1. GLSL 升级至 1.2 版; 2. 支 持 非 正 方 形 的 矩 阵 . UniformMatrix{2x3,3x2,2x4,4x2,3x4,4x3}fv ;3. 象素缓冲对象(Pixel Buffer Object). 它扩充了缓冲对象的接口. 现在缓冲区对象可以支持顶点数组和象素数据了.象素缓冲对象能加速在 GPU 内存中进行的缓冲区之间的数据拷贝及其他象素操作.;4. sRGB 纹理. 遵循 IEC61966-2-1.标准的 sRGB 颜色空间 的纹理格式(包括压缩和非压缩格式).
在 Windows 平台上,OpenGL 驱动可能有三种模式:纯软件、MCD 和 ICD:
(1)纯软件模式:微软提供一个 OpenGL 的软件实现,所有渲染操作均由 CPU 完成,速度很 慢。如果安装系统时使用 Windows 自带的显卡驱动程序,那么 OpenGL 程序就会运行在软件模 式下。而且由于微软有自己的 Direct3D,所以对 OpenGL 的支持很消极,它的 OpenGL 纯软件 实现只支持 OpenGL1.1。
(2)MCD(Mini Client Driver):MCD 是早期微软在 Windows NT 上支持 OpenGL 时,为了简化 驱动开发时使用的一个模型。在这个模型中,OpenGL 渲染管线的变换、光照部分仍然由软件实现,而光栅化部分则由硬件厂商实现,因此只要硬件支持,MCD 可以硬件加速光栅化部分。
MCD 虽然可以简化驱动开发,但是功能限制太大,现在市面上的3D 加速卡均支持硬件变换和光照,MCD 却不能利用这一特性,看上去 MCD 已经没有存在的价值
(3)ICD(Installable Client Driver):ICD 是一个完整的 OpenGL 驱动模型,比 MCD 复杂得多。 硬件厂商要实现完整的 OpenGL 渲染管线,如变换、光照、光栅化等,因此只要硬件支持,ICD 可以硬件加速整个 OpenGL 渲染管线。我们通常说的 OpenGL 硬件加速就是指的通过 ICD 模型 获得的硬件加速,而现在硬件厂商提供的 OpenGL 驱动程序也都是依照 ICD 模型开发的。
Windows 怎么实现 OpenGL 硬件加速呢?OpenGL32.dll 是微软的 OpenGL 1.1 纯软件实现, 我们的程序都要动态链接到这个 dll。如果安装 3D 芯片厂商的驱动程序,会将一个不同名字的 dll 放到 Windows 系统目录下,比如在 Windows 2000 下安装 nVIDIA GeForce2 MX 的驱动程序, 会在系统目录下放一个 nvoglnt.dll(这就是 nVIDIA 的 OpenGL 驱动),并在注册表中登记 nvoglnt.dll,让 Windows 知道硬件加速 OpenGL 驱动的名字,以后运行OpenGL 程序,OpenGL32.dll 就会把 OpenGL 调用直接转到 nvoglnt.dll。
Windows 平台上,一个 OpenGL 程序是否使用硬件加速由三个因素决定,这三个因素缺一 不可,否则程序都会运行于纯软件模式:
(1)是否有一块 3D 加速卡
(2)是否安装了显卡厂商提供的最新的驱动程序,Windows 自带的显卡驱动程序并不会提供
OpenGL 硬件加速能力
(3)指定的像素格式是否被显卡硬件所支持
OpenGL Extension 这个软件可以自动测试显卡对 OpenGL 的版本支持和扩展命令。
如果你在 Windows 平台下开发 OpenGL 程序,那么系统中自带的 OpenGL 库就是 1.1 的, 如果想使用 1.2 或者更高版本的 OpenGL 库,那么只能使用 OpenGL 扩展。很多参考书上都会 提到 OpenGL2.0、OpenGL2.1,但是微软对 OpenGL 的支持只到 1.1,1.1 以后微软就不再支持了, 为什么,因为微软更想发展自家的 DirectX。所以如果想使用 OpenGL1.1 以上的功能或者函数, 只能使用 OpenGL 扩展,这些扩展是一些 OpenGL 团体或个人开发出来的能 Windows 上使用的 OpenGL1.1 以后的一些功能及函数。所以,在 Windows 上根本就没有什么 OpenGL2.0 的头文件 或库文件了,OpenGL1.1以后的东西都已经以扩展的形式存在了,而且,并没有一个统一的标 准,你可以使用 glex,glew,glee 等等。
是否能用扩展和显卡的功能有关,const GLubyte * glGetString( GLenum name )我们以 GL_EXTENSIONS 为参数调用该函数,就能获得当前显卡所支持的所有扩展,像下面这样:constGLubyte *str = glGetString(GL_EXTENSIONS) ;cout < (1)使用 glext 在网络上可以下载 a)头文件的包含 这个文件并不是 Windows 系统中原有的,需要到网上下载。使用的时候有一点要注意,如果程序中还用到了 glut.h 文件,那么一定要把 glext.h 放在 glut.h 的后面,因为 glext.h 要用到 gl.h,而 glut.h 中包含了 gl.h,如果顺序搞错了,编译的时候会有一大堆错误, 正确的顺序如下: #include #include #include #include b)获取函数指针 先定义函数指针,PFNGLBLENDEQUATIONPROC glBlendEquation = NULL; 再获取函数地址, 使用 wglGetProcAddress 函数,注意这一句要加在使用 glBlendEquation 函数 的语句之前才有效,最后后面紧跟着使用 glBlendEquation 的函数语句,切记不要加在所有子 程序的外面,否则获取的指针是无效的 glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation"); 例如可以这样加: PFNGLBLENDEQUATIONPROC glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation"); switch(key) { case 'a': case 'A': //Note: glBlendEquation is a subset ofGL_ARB_imaging, please call glGetString //first to confirm whether your videocard supportthisextension. glBlendEquation(GL_FUNC_ADD) ; break ;
case 's':
case 'S':
(2) 使用 glew
glBlendEquation(GL_FUNC_SUBTRACT) ;
break ;
glew 也是一个扩展库,包含了 OpenGL 中许多核心及扩展函数,支持 OpenGL2.1,可以到这里下载:http://glew.sourceforge.net/
上面的方法可能有些麻烦,如果已经下载了 glew 库的话,那么可以直接使用该扩展,但 是使用之前首先要确定你的显卡是否支持该扩展。方法如下:首先还是要判断显卡是否支持该 扩展,我们这里假定已经支持,1).包含头文件 glew.h,注意这里和上面不同,这回 glut.h 要放在 glew.h 的后面了 像下面这样
#include
#include
然后就可以在程序中直接使用 glBlendEquation 了,其他扩展的判断和使用方法与此类似。 最后还有一点切记!那就是还要调用 glewInit() ;来初始化一下方可使用扩展,如下:
GLenum err = glewInit() ;
if (GLEW_OK !=err)
{
MessageBoxA(NULL, "error","My Window",1) ;
}
你现在可以使用扩展了!
DirectX 是微软独自开发的 API,很多人认为它只是一个专门针对显卡的图形 API,其实不 然。DirectX的服务范围涵盖图形、输入/输出、音频、显示、多媒体等等许多领域,组件包括 Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects 等等,只是因图形方面的应用最为重要而为人熟知,微软近些年对 DirectX 作版本升级也主要着眼于图形领域。
DirectX 的发展之路并不顺利,在相当长的时间内都为软硬件厂商所排斥,但在 DirectX 7.0 之后,它在人们心目中的形象逐渐被扭转,而 DirectX 8.0 的优异表现令它具备了超越 OpenGL 的实力,DirectX 9 更一举成为 PC 领域 3D 图形 API 的主宰者。
1995 年至 1996 年,微软实行了一项新计划,以支持在 Windows95 上运行游戏,目标是 把市场扩展到被任天堂和世嘉控制的游戏领域。然而,微软不想用已经在 NT 上提供的 OpenGL技术。微软收购了 Rendermorphics,Ltd.并得到他的被称作 RealityLab 的 3D API。经重新整理, 微软发布了新的 3D API——Direct3D。
微软,推行 Direct3D,冻结 OpenGL!
微软当时拒绝了在 Window95 上支持 OpenGL。不止如此,微软采取异常手段收回对 OpenGL的 MCD 驱动接口的支持,以致硬件厂商不得不放弃已经进入最后测试的 OpenGL 驱动。微软 的市场部门开始向游戏开发商、硬件厂商、新闻出版机构推销 Direct3D,同时排斥 OpenGL。
API 之战!
Silicon Graphics 和很多 OpenGL 用户都依赖 OpenGL 创新且高性能的技术。但很明显微 软打算用 Direct3D 代替 OpenGL,尽管 D3D 有很多问题而且不能像 OpenGL 那样被硬件厂商扩 展。Silicon Graphics 决定在 1996 SIGGRAPH 会议上作一项演示。演示证明 OpenGL 至少和 D3D 一样快,从而驳倒微软的市场论调。因为 OpenGL 是业界公认标准,比 D3D 功能丰富,而且图 像质量要高一些,所以演示在计算机图形和游戏开发社区导致了激烈论战。
游戏开发者要求 OpenGL 和 D3D 站在同等地位!
当技术和市场问题暴露,强烈的支持 OpenGL 行动开始了。Doom 的开发者 John Carmack 声明拒绝 D3D,Chris Hecker 在游戏开发杂志上发表了两套 API 的全面分析,移微软应放弃 D3D 为结论。游戏开发者先后两次向微软递交请愿书。第一次由 56 名首席游戏开发者要求微软发 行 OpenGL MCD 驱动,但未成功,因为会让 OpenGL 与 D3D 竞争。第二次的公开信由 254 人签 名开始,截止时达到 1400 人。微软的回答仍是重申旧市场立场。尽管请愿者清楚的要求两套 API 同等竞争以促进发展,微软却以增加 D3D 的投资、更加减少 OpenGL 的投资为回应。
1995 年,微软的第一个 API——DirectX 1 发布。这个API 极其简单,它仅提供了对 2D 图形和基本音频功能的支持,主要是为了弥补 Windows 95 对图形管理的不足。这完全可以理解, 当时的在 PC 中还不存在 3D 游戏,也没有什么 3D 显卡,对于面向商业用户和家庭的 PC 而言3D 功能也不是必要的。可想而知,DirectX 1 几乎毫无声息,采不采用根本无关紧要。
1996 年,DirectX 的第二个版本 DirectX 2 推出。它引入了 Direct3D 技术、需要执行缓冲区, 看起来与 DirectX 1 有了巨大的变化。DirectX 2 采用平滑模拟和 RGB 模拟两种方式来加速 3D 图 像生成;同时,原有的 2D 部分得到了有效增强、加入了 2D 动态效果,并更正了原有的一些 bug。此外,DirectX 2 的用户设置程序也变得更加友好。整个 DirectX 的设计架构基本确定,它 也是如今的DirectX 的雏形。Trident、S3 公司开始支持 DirectX 2,代表游戏是《红色警报》和《命令与征服》。
DirectX 3.0 的推出是在 1997 年最后一个版本的 Windows95 发布后不久,此时 3D 游戏开 始深入人心,DirectX也逐渐得到软硬件厂商的认可。97 年时应用程序接口标准共有三个,分 别是专业的 OpenGL 接口,微软的 DirectX D 接口和 3DFX 公司的 Glide 接口。而那时的 3DFX 公 司是最为强大的显卡制造商,它的 Glide 接口自然也受到最广泛的应用,可是 3DFX 的自我封 闭,不开放政策,导致它后来的破产被 Nvidia 收购,Glide 接口才逐渐消失了。
DirectX 3.0 是 DirectX 2.0 的简单升级版,它对 DirectX 2.0 的改动并不多。包括对 DirectSound(针 对 3D 声音功能)和 DirectPlay(针对游戏/网络)的一些修改和升级。DirectX 3.0 集成了较简单 的 3D 效果,还不是很成熟。DirectX 3 还是有一定的拥戴者,nVIDIA Riva128 和 Intel 的 i740 都 支持它,代表游戏包括《摩托英豪》和《极品飞车 3》。
1997 年,微软没有发布 4.0 版本的 DirectX,DirectX3.0 发布后没多久发布了 DirectX5.0。
尽管 5.0 与 3.0 时间间隔不长,但它的意义可不简单。DirectX5.0 的 D3D 效果可以与当时的 OpenGL 平分秋色。DirectX 5 在技术上有了明显提高,微软对 Direct 3D 作了彻底修改:加入雾化效果、Alpha 混合等特效,大大增强3D 游戏的真实感;加入 S3 的纹理压缩技术,有效提高 了显存带宽的利用率。此外,DirectX 5 在音频、游戏控制方面均做了大量的改进,游戏开放商 的移植工作也变得更简单,DirectX 5 可以说是 DirectX API 技术成熟的标志。nVIDIA RivaTNT 支 持 DirectX 5,虽然 nVIDIA 当时尚未成为图形业的霸主,但 RivaTNT 已展现出强劲的实力,DirectX5 规格应该说立下了一定功劳,而它的代表游戏就是《古墓丽影 3》。这个时候,OpenGL 已经 在《Quake2》之类的 3D 游戏中发挥威力,许多 3D 游戏都选择了 Quake2 引擎,至少在纯 3D 领域,OpenGL 的影响力远甚于 DirectX 5。
1998 年,DirectX 6 推出。其最大的竞争对手之一 Glide,已逐步走向了没落,DirectX 已被 许多厂商认可并成为 2D 游戏和部分 3D 游戏的标准 API。DirectX 6 的进步同样显而易见:可优 化 3D 图像质量的双线性过滤、三线性过滤技术被引入,实现了多纹理、顶点缓冲和凸凹映射 等功能。nVIDIA 的 TNT2 继续对它提供支持,代表游戏则是《极品飞车 5》和《CS》。但 OpenGL的影响力仍大过 DirectX 6,这很大程度上是受 idSoftware 的 Quake Ⅲ游戏影响,该款游戏只 能运行于 OpenGL 模式下。此外,基于Quake Ⅱ引擎的 Counter Strike 游戏火爆一时并延续至 今,这些游戏在 OpenGL 模式下具有更理想的性能表现。这个时候,OpenGL 还被广泛认为优 于 DirectX。
1999 年,DirectX 7 发布——它也是 DirectX API 发展史上的转折点。这个时候,nVIDIA 已 经取代 3dfx 成为图形领域新霸主,它开创的 GPU 概念更是将对手远远抛到了后头。GPU 意即 “图形处理器”,专门负责 3D 游戏中物体的几何转换和光源处理,此前这类任务是由 CPU 来完成的,GPU的概念堪称图形技术的里程碑:一方面,显卡摆脱了 CPU 的限制、可以自主决定系统的图形性能;另一方面,CPU 也从繁重的劳动中获得解放、可将更多的运算力用于其他 任务的处理。第一枚 GPU 图形芯片是 nVIDIA 的GeForce,微软及时在 DirectX 7 中对其提供了 支持:加入硬件几何转换与光源处理技术(即所谓的“硬件 T&L”)以及贴图的矩阵混合,自 然,它获得更广的支持度。包括后来 ATI 的 Radeon 显卡也支持 DirectX 7。
DirectX 7.0 最大的特色就是支持 T&L,中文名称是“坐标转换和光源”。3D 游戏中的任何 一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换;3D 游 戏中除了场景+物体还需要灯光,没有灯光就没有 3D 物体的表现,无论是实时 3D 游戏还是3D 影像渲染,加上灯光的 3D 渲染是最消耗资源的。虽然 OpenGL 中已有相关技术,但此前从 未在民用级硬件中出现。
在 T&L 问世之前,位置转换和灯光都需要 CPU 来计算,CPU 速度越快,游戏表现越流畅。 使用了 T&L 功能后,这两种效果的计算用显示卡的 GPU 来计算,这样就可以把 CPU 从繁忙的 劳动中解脱出来。换句话说,拥有 T&L 显示卡,使用 DirectX 7.0,即使没有高速的 CPU,同样 能流畅的跑 3D 游戏。
真正的质变发生在 DirectX 8 身上。2000 年 DirectX 8.0 的推出引发了一场显卡革命,同DirectX 7 相比,DirectX 8 没有硬件 T&L 的概念,取而代之的是具有可编程能力的 Vertex Shader(顶点着色引擎)和 Pixel Shader(像素着色引擎)。相比机械式的硬件 T&L,Vertex Shader 和 Pixel Shader 可提供更优异的效能,例如创建出水波纹的动态效果、衣物的褶皱及光线变化效果,这在以往根本不可能实现。此外,DirectX 8 在视频、音频等方面也有许多重要的改进,综 合实力全盘超越 OpenGL,nVIDIA 和ATI 都将它作为标准的图形 API 加以支持,OpenGL 则退缩 为它们的第二选择,对游戏开发商而言也是如此。2001 年,微软发布 DirectX 8 的升级版:DirectX8.1,它将 Pixel Shader 的版本提高到 1.4,同样支持者趋之若鹜,大量的 3D 游戏和几乎所有的2D 游戏都对它提供支持。此时 DirectX 的权威地位终于建成。
2002 年底,微软发布 DirectX9.0。DirectX 9 构建于 DirectX 8.0/8.1,但它并不是功能上的小 修小补,而是带来了许多革命性的新特性,传统的硬件 T&L 单元也被取消。这些新特性主要包 括以下几个方面:将顶点着色引擎、像素着色引擎升级至 2.0 版本;浮点色彩处理的精度提高 到 128 位(DirectX 8.0/8.1 为 32 位);引入硬件位移贴图的概念;支持 40 位真彩色;增加 Z 伽 玛修正和提供对剪裁平面技术的支持等等。
与过去的 DirectX 9.0b 和 Shader Model 2.0 相比较,DirectX 9.0c 最大的改进,便是引入了 对 Shader Model 3.0(包括 Pixel Shader 3.0 和 Vertex Shader 3.0 两个着色语言规范)的全面支持。 使得 GeForce 6、GeForce7 系列以及 Radeon X1000 系列立刻为新一代游戏以及具备无比真实感、 幻想般的复杂的数字世界和逼真的角色在影视品质的环境中活动提供强大动力。DirectX 9.0c 和 Shader Model 3.0 标准的推出,可以说是 DirectX 发展历程中的重要转折点。在 DirectX 9.0c中,Shader Model 3.0 除了取消指令数限制和加入位移贴图等新特性之外,更多的特性都是在 解决游戏的执行效率和品质上下功夫,Shader Model 3.0 诞生之后,人们对待游戏的态度也开 始从过去单纯地追求速度,转变到游戏画质和运行速度两者兼顾。因此 Shader Model 3.0 对游 戏产业的影响可谓深远。
Directx 10 已经包含在 2007 年发布的 Windows Vista 操作系统中。DirectX 10 使你获得更好 的图像显示质量,使多人游戏具可伸缩性,以及包括更棒的音频效果。它强化了针对 DirectDraw 和 Direct3D 的接口,简化了应用扩展,提升性能;改善了图形创作工具,更易于做出最佳的3-D 角色和环境;点光源式光影和像素式光影使图象更逼真;强化了 DirectSound 和 DirectMusic, 简化了其应用扩展;DLS2 音频合成功能提高了乐器音频的真实感;DirectInput 的设备影射功 能令对设备的支持更简单;DirectPlay 使多人游戏的性能和可扩展性得到了提高; DirectPlay 提供了 IP 声音通讯;DirectShow 的应用编程接口提供了音频/视频的实时合成和即时编辑;DirectShow 支持 Windows 媒体音频和视频(WMA 和 WMV)的读写; Microsoft TV 技术可以支持数字电视节目。当然,最重要的是一些新游戏需要它。 DirectX Redist 通常每两个月更新一次, 包含了 DirectX Runtimes 的所有更新,可以替代此前发布的旧版本,适合 Windows XP、Server2003、Vista等操作系统,不支持 Windows 9x/2000。一般最新的 3D 游戏等应用程序都需要新 的 DirectX 接口,因此强烈推荐更新, Vista 用户也同样需要。
微软 DirectX 更新地址
http://www.microsoft.com/downloads/Browse.aspx?displaylang=zh-cn&categoryid=2
随着微软 2008 年发布的 Windows VistaSP1,微软又公布了 DirectX 10 的升级版——DirectX10.1,在保持了 10 版本的原有整体结构和编程体系,同时顶点,几何和像素着色指令集也会 得到更新到支持 Shader Model 4.1。此外,DirectX 10.1 还提供了许多增强功能,如对 HDR 光源 效果的改进,反锯齿的改进,更为精确的管道,全局照明特效等。
作为两大图形 API 阵营,OpenGL 和 DirectX 在各自的发展中形成鲜明的特点:即便处于目 前的低潮状态,OpenGL 仍然牢牢把持着专业绘图领域,而 DirectX 在此毫无竞争力,功能更强 大的OpenGL 2.0 无疑将继续保持垄断性地位。但在 3D 游戏领域,OpenGL 的确是处于弱势地 位,它几乎丢光所有的市场。而 DirectX 9 已经牢牢在游戏中站稳了脚跟,凭借领先的功能特 性和微软在操作系统方面的先天优势,刚刚推出的DirectX 10 理所当然成为多数游戏开发商的 首选,它的应用范围除了 3D 游戏还涵盖 2D 游戏领域,这正是 OpenGL 所欠缺的。
其实,OpenGL 和 DirectX 并不是完全对立的,二者存在一定的竞争又需要进行相互协作, ARB 公布 OpenGL 2.0 的改进和开发计划后,微软表现出异乎寻常的兴趣,而 ARB 的各个成员 也在 3Dlabs 的带领下抛开分歧进行紧密的合作;各成员表示未来将专注于实现 OpenGL 2.0 的 开发目标,而不再会为了自身利益让 OpenGL 变得一团糟,就连一向针锋相对的 nVIDIA 与 ATI 也致力于彼此技术的整合。ARB 集体宣誓:“所有送至 OpenGL 的创意想法,一经采用,便免 费公开给所有人使用。”相信这种开放性的做法有助于 OpenGL 在技术上继续保持领先。至于DirectX 体系,微软一直没有放弃进入高端的想法,但它注重的还是 PC 娱乐平台,在下一代DirectX 版本中,我们可以看到更多更先进的功能特性,相信这也将继续成为图形业发展的指导方向——当然这只是针对 PC 而言。
支持何种 API 是显卡分代的标志,这在 DirectX 规格上体现得极为明显。许多用户往往认 为支持 DirectX 高版本的显卡可以提供更理想的性能,其实这是一个误区。我们知道,API 只是 函数的集合,它自身不决定任何东西,只是充当游戏和显卡硬件之间的媒介、让游戏和显卡都 不需要为兼容性问题而烦恼。而不同版本 API 的区别在于函数库的差异,高版本的 API 总是提供数量更多、功能更强的函数,游戏开发商利用这些函数可以创造出各种各样的特效。如果图形芯片可对此 API 提供支持,那也就意味着基于该图形芯片的显卡可以将这些游戏特效完美展 现出来,无法支持该 API 的图形芯片将无法识别游戏特效调用的函数库,自然就无法正常运行。 但 API 自身与图形芯片的硬件性能没有任何关系,图形芯片的性能取决于其核心设计和运 行频率,API 只是提供功能方面的支持而已,所以认为具备高版本 API 支持的显卡一定比采纳 低版本 API 的显卡速度快是没有道理的,举个例子,支持 DirectX 9 的 GeForce7 高端显卡 GF7900 肯定比支持 DirectX 10 API 的 GeForce8 低端显卡 GF8400GS 速度更快,当然,我们可以说高版
本 API 支持总是比较“好”的,因为它可以支持更多的新游戏。
3dfx 是计算机 3D 时代的开创者,1995 年 11 月,3dfx 推出 Voodoo 加速卡。凭借令人惊 叹的 3D 效果,Voodoo 得以风靡市场、最终成为不朽的神话。3dfx 迅速发展壮大并在 1997 年 达到最巅峰。为了配合自己的硬件技术,3dfx 推出专门针对 Voodoo 系列的 API:Glide。Glide 提供了完整的三维图形开发环境,开发者可以使用其最高层的 API 创建和操作各种复杂的三维 对象。Glide 支持立即模式和驻留模式,前者与OpenGL 类似、需要向图形芯片提供画图命令,优点是可提供精细的控制;后者则采纳面向对象的编程结构,场景几何数据被存储到一个对象数据库中,程序员无需掌握三维对象内部结构的知识就可以通过对象调用来进行各种各样复杂的操作、具有优良的易用性。此外,Glide 支持 Voodoo 提供的一系列先进硬件特性,例如镜面 高光、阿尔法透明处理、动画贴图、反锯齿等等。由于功能强大、稳定性和易用性都相当出众,Glide 被认为是当时最理想的 3D 图形 API,加上 3dfx 在图形行业的霸主地位,各游戏开发商顺利成章地选择 Glide 来开发产品,所以在当时,几乎所有的3D 游戏都是以 Glide 作为基准,而它也确实不负众望。
不过,Glide 有一个致命的缺陷:它是 3dfx 专属性的图形接口,其他图形芯片制造商无法 对其提供支持,导致 nVIDIA、Matrox、S3 等竞争对手选择了微软的 DirectX API。虽然一开始 DirectX 功能简单、设计糟糕,但在3.0 版之后,DirectX 逐渐变得成熟,越来越多游戏开始对 其提供支持。由于人所共知的原因,3dfx 在 1997 年之后迅速没落,专用的 Glide API 已经对游 戏开发商毫无吸引力,这个时候,Glide 逐渐被抛弃、慢慢消失在人们的视野中。1999 年 12 月,困境中的 3dfx 终于决定将 Glide 完全公开,但这个时候已经没有多少人对它感兴趣了,强 大的 OpenGL 和成熟中的 DirectX 成为游戏开发商的新宠。
http://www.opengl.org/sdk/libs/
开发人员参考资料
OpenGL Software Development
Kit
Get started with DirectX® 10
http://msdn.microsoft.com/en-us/directx/default.aspx
NVIDIA DeveloperWebSite
http://developer.nvidia.com/page/home.html
http://developer.amd.com/GPU/Pages/default.aspx
Copyleft 2008