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,所有的供应商都必须支持该扩展。

着色器--图形卡上的程序

着色器(shader)这个词带有一定的误导性。最初的着色器程序主要用于处理组成每个多边形表面的像素,以便为模型着色。但是随着时间推移,着色器程序的功能已经被扩展,现在还可以修改顶点属性、创建新顶点,甚至完成一般的操作。

着色器与运行在CPU上的普通程序具有不同的工作方式。着色器程序在大量的元件上同时执行,这意味着着色器程序是大规模并行程序,而运行在CPU上的程序一般则是串行运行的,一次只有一个实例运行。着色器程序非常适合对构成3D世界的像素和顶点的集合执行操作。

目前共有3类着色器,分别是顶点着色器、几何着色器和像素着色器,每种着色器都只能执行特定的操作。顶点着色器处理顶点,像素着色器处理像素,几何 着色器处理图元。为了降低复杂性,并使硬件制造商可以更高效地进行优化,所有这些着色器都被一种叫统一着色器(unified shader)的着色器替代了。

着色器通过运行在图形卡上的特殊语言进行编程。目前,这些语言比C++低级得多(更别提C#了)。OpenGL有一门叫做GLSL(OpenGL Shading Language,OpenGL着色语言)的着色语言,它与C语言有些类似,但是有大量用于处理向量和矩阵的特殊操作。DirectX也有自己的着色语 言,叫做HLSL(High Level Shading Language,高级着色语言)。两种语言十分类似。让人更加困惑的是,除了这两种语言以外,还有一种叫做Cg的语言,它由Microsoft和 Nvidia开发,与HLSL有些类似。

游戏中的着色器非常适合创建需要进行大量计算的特殊效果,如视差贴图的光照。当前的技术使得着色器程序几乎不能用于其他用途。本书主要介绍游戏编 程,由于可编程流水线是一个很大的主题,所以不会讨论该技术。如果对此主题感兴趣,可以参阅附录A部分,那里介绍了几本非常好的书籍。

着色器的一种趋势是用于一般性的并行编程任务,而不只是处理图形。例如,Nvidia PhysX库允许在GPU而非CPU上完成物理计算,从而得到更佳的性能。PhysX是用另外一种叫做CUDA的着色器语言编写的,但是CUDA与其他着 色器语言有一些不同,这种语言不怎么关注像素和顶点,而是更关注一般目的的并行编程。假设在游戏中要模拟一个城市,并且有一个非常新奇的并行算法可以更新 城市中的全部居民,那么这种计算在GPU上可以更快地执行,而CPU就可以被解放出来,执行其他任务。CUDA通常用于科学研究项目,因为这是利用强大的 计算能力的一种廉价的方式。使用CUDA的应用程序包括量子化学计算、心肌模拟和黑洞建模。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值