摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”
Cg(C for Graphcis)语言,是NVIDIA与Microsoft合作研发,旨在为开发人员提供一套方便、跨平台(良好的兼容性),控制可编程图形硬件的高级语言。Cg语言的语法结构与C语言非常类似,使用Cg编写的着色程序默认的文件后缀是*. Cg。
4.1 开始Cg之旅
在NVIDIA的http://developer.nvidia.com/object/cg_toolkit.html网页上下载Cg Toolkit ,截止到2009年10月,Cg语言的版本为2.2。下载之后直接安装即可。在安装目录的bin目录下一个可执行程序:cgc.exe。这是NVIDIA提供的Cg程序编译器。
Cg语言规范是公开和开放的,并且 NVIDIA开放了Cg编译器技术的源代码,使用无限制的、免费的许可证。
目前还没有一个主流的专门为编写着色程序而开发的IDE,很多人都是直接在文本中写好程序后,然后将文件后缀改为.cg。在网上有一个名为NShader(http://nshader.codeplex.com/)的Visual Studio2008插件,安装之后可以支持编写着色程序。图 11展示了使用该插件之后的使用效果。
4.2 CG特性
Cg同时被OpenGL与Direct3D两种编程API所支持。这一点不但对开发人员而言非常方便,而且也赋予了Cg程序良好的跨平台性。一个正确编写的Cg应用程序可以不做任何修改的同时工作在OpenGL和Direct3D之上。
4.3 CG 编译
4.3.1 CG编译原理
计算机只能理解和执行由0、1序列(电压序列)构成的机器语言,所以汇编语言和高级语言程序都需要进行翻译才能被计算机所理解,担负这一任务的程序称为语言处理程序,通常也被称为编译程序。例如C或者C++ 编写的程序,需要首先编译成可执行文件(.exe文件),然后才能在GPU上运行,且一旦编译后,除非改变程序代码,否则不需要重新编译,这种方式称为静态编译(static coompilation)。静态编译最重要的特征是:一旦编译为可执行文件,在可执行文件运行期间不再需要源码信息。而动态编译(dynamic compilation)与之相反,编译程序和源码都要参与到程序的运行过程中。
Cg语言通常采用动态编译的方式,即,在宿主程序运行时利用Cg运行库( Cg Runtime library)动态编译Cg代码,使用动态编译的方式,可以将Cg程序当作一个脚本,随时修改随时运行,节省大量的时间,在OGRE图形引擎中就是采用这样的方法。在文献[2]的1.4.2章节中提到Cg语言同样支持静态编译方式,即,Cg源码编译成汇编代码后,这部分目标代码被链接到宿主程序最后的可执行程序中。使用静态编译的好处是只要发布可执行文件即可,源码不会被公开。
Cg编译器首先将Cg程序翻译成可被图形API(OpenGL和Direct3D)所接受的形式,然后应用程序使用适当的OpenGL和Direct3D命令将翻译后的Cg程序传递给图形处理器,OpenGL和Direct3D驱动程序最后把它翻译成图形处理器所需要的硬件可执行格式。NVIDIA提供的Cg编译器为cgc.exe。
Cg程序的编译不但依赖于宿主程序所使用的三维编程接口,而且依赖于图形硬件环境,因为图形硬件自身的限制,不一定支持某种Cg语句,例如,如果你所使用的GPU并不支持循环控制指令,那么在Cg程序中编写的循环控制语句将无法通过编译。被特定的图形硬件环境或AIP所支持的Cg语言子集,被称为Cg Profiles。需要注意的是: profile分为顶点程序的profile和片段程序的profile,这是因为顶点着色器和片段着色器原本就不是工作在同一个硬件。
Cg Profiles是Cg语言的重要组成部分,在使用Cg语言编写着色程序时,首先要考虑的一点就是“当前的图形硬件环境支持那个Cg Profile”,这直接关系到您所编写的着色程序是否可以在当前的图形硬件上运行。