OpenGL 简 介(6)

 

与像素着色器和顶点着色器相比,几何着色器加入的时间较晚。几何着色器以一个完整的图元(如线、点或三角形组成的带)作为输入,而顶点着色器针对每个图元都会运行。几何着色器可以创建新的顶点信息、点、线,甚至图元。几何着色器还可用于创建点精灵和动态镶嵌,以及实现其他一些效果。点精灵可以快速渲染大量精灵,这种技术经常用于粒子系统,可创建类似于火焰或者烟雾效果。动态镶嵌可以在几何形状中添加更多的多边形。这种技术可以用来增加包含多边形数较少的游戏模型的平滑度,并在摄像机放大模型时展现更多的细节。

像素着色器会应用到被发送到帧缓冲区的每个像素。像素着色器用于创建凹凸贴图效果、镜面高光和逐像素光照。凹凸贴图效果可以给表面增加额外的高度信息。凹凸贴图通常包含一个图片,其中每个像素代表一个标准的法向量,该法向量描述了如何扭曲表面。像素着色器可以使用凹凸贴图来为模型提供一个更有趣的纹理,使其看上去有一定的深度感。逐像素光照用于替换OpenGL的默认的光照公式。OpenGL的光照公式可计算出每个顶点的光照,然后为该顶点提供一种合适的颜色。逐像素光照使用更精确的光照模型,为每个像素单独应用光照。镜面高光是模型中非常亮、反射大量光的区域。

2.2  变化中的OpenGL

现在是学习OpenGL的大好时机。OpenGL的当前版本非常适合学习。这个版本中包含了大量易于使用的函数,可以完成各种各样与图形处理有关的工作。可以把OpenGL的当前版本想象成一个带有辅助轮的自行车,刚开始时借助它们学习怎么骑车,熟练之后就把它们取下来。OpenGL的下一个版本更像是一个性能强大的摩托车,没有必要的东西都被移除了,剩下的就是不受限制的原始力量。对于有经验的OpenGL程序员,其好处自不必言,但是初学者却容易对其望而生畏。

可以使用的OpenGL版本要取决于系统中安装的图形卡驱动程序。几乎每台计算机都支持OpenGL 2.1,而近期生产的图形卡会支持OpenGL 3.x。

2.2.1  OpenGL ES

OpenGL ES是用于嵌入式系统的OpenGL的新版本。它与OpenGL的近期版本相似,但是功能集更加受限。它用于高端手机,例如Android、BlackBerry和iPhone。OpenGL ES也用于军用硬件,例如战机上的平视显示器。

OpenGL ES支持可编程流水线,也支持着色器。

2.2.2  WebGL

WebGL目前仍处于开发中,这个版本的OpenGL是专为在Web上使用而设计的。使用WebGL的浏览器必须支持HTML 5 canvas标签。就现在而言,还无法知道它会取得多大的成功。以前人们曾有过在Web上使用3D的尝试,但是都失败了。例如,VRML(Virtual Reality Modeling Language,虚拟现实建模语言)与HTML类似,但是允许用户创建3D世界,它在学术界受到了不少关注,却从没有吸引过普通的用户。

WebGL有一些强有力的支持者,许多大公司都加入了WebGL工作组,如Google、Apple和Mozilla,而且WebGL还有一些让人印象非常深刻的演示。就目前来看,WebGL的性能还是不错的,在成熟以后很可能可以与Flash一较高低。

2.3  OpenGL和图形卡

OpenGL是一个允许程序员发送指令到图形卡的库。图形卡是一种专用于显示3D数据的硬件,由很多标准组件构成,包括帧缓冲区、纹理内存和GPU。GPU是图形处理单元(Graphics Processing Unit)的缩写,它控制着如何处理顶点并把它们显示到屏幕上。CPU向GPU发送指令和数据,描述每一帧应该怎样显示到屏幕上。纹理内存通常是一块较大的内存,用于存储游戏所需的大量纹理。帧缓冲区是内存中的一块区域,存储下一帧中将显示到屏幕上的图像。现代的图形卡通常有多个GPU,每个GPU上都有许多着色器处理单元来执行大规模的并行着色器操作。分布式应用程序(如模拟蛋白质折叠的Folding@home)和世界各地的数十万台计算机都利用了这一特点。

第一个获得流行的3D图形卡是3dfx Voodoo 1。这是早期的一个图形卡,有2MB的纹理内存和2MB的帧缓冲区,并且使用PCI总线,时钟速度为135MHz。早期的一些游戏使用它来加速执行,例如《古墓丽影(Tomb Raider)》、Descent II、《雷神之锤(Quake)》以及《雷神之锤2(Quake 2)》的演示,从而运行得更加流畅,并且可显示更多的细节。Voodoo 1使用一个标准的PCI总线,允许CPU以最高533MB/s的速度向图形卡发送数据。现代的图形卡已经从PCI转向使用AGP(Accelerated Graphics Port,加速图形端口),其最高数据发送速度为2GB/s,后来又转向使用PCI Express。当前的这一代PCI Express卡的最高数据发送速度为8GB/s。

好像每个月都会有新的图形卡问世,每个新图形卡都比之前的图形卡更快。在编写本书时,最快的图形卡可能是ATI Radeon HD 5970。它有两个GPU,每个GPU都有1600个着色器处理器。它的时钟速度为725MHz,每秒可以处理4.64万亿次浮点运算。

大多数现代图形卡都有专门执行新操作的特殊硬件。这种硬件通过使用扩展提供给OpenGL。当收到一个标识新扩展的字符串时,OpenGL能够展示驱动程序和图形卡中的功能。例如,ATI Radeon HD 5970有两个GPU,这种情况很少见。为了能够充分利用两个GPU,需要使用一些新的扩展方法,如AMD_gpu_association。这个扩展允许用户在两个GPU之间分配任务。如果多家供应商实现了相同的扩展,那么扩展字符串的某个位置会有字母EXT。有时候,控制OpenGL规范的架构评审委员会可能会把某个扩展的状态提升为官方扩展,此时,扩展字符串中将包含字母ARB,所有的供应商都必须支持该扩展。

读书导航