频道栏目
读书频道 > 软件开发 > C# > 精通C#游戏编程
2.3 OpenGL和图形卡
2012-08-01 16:01:56     我来说两句
收藏   我要投稿

本文所属图书 > 精通C#游戏编程

本书通过引导读者创建一个基本的游戏,展示了如何使用c#和OpenGL一步步地开发出简单、整洁而可靠的代码。C#是一种高级编程语言,而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的应用程序包括量子化学计算、心肌模拟和黑洞建模。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.2.2 WebGL
下一篇:2.4 Tao框架
相关文章
图文推荐
排行
热门
最新书评
文章
下载
读书
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站