OpenGL 简 介(7)

 

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

着色器(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.4  Tao框架

Tao框架是C#使用OpenGL库的一种方式。Tao包装了许多C库(见表2-1),并使得在C#中使用这些函数变得很简单。Tao中还绑定了Mono,所以也可以用在Linux和Mac中。

通过Tao,C#不只可以使用OpenGL,还可以使用其他一些有用的库。

 

读书导航