2023年6月20日发(作者:)

HLSLGLSLCG着⾊语⾔⽐较摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中⽂名“GPU编程与CG语⾔之阳春⽩雪下⾥巴⼈”

In the last year I have never had to write a single HLSL/GLSL shader. Bottom line, I can’t think of any reason NOT to use CG. shader language,称为着⾊语⾔,shade在英语是阴影、颜⾊深浅的意思,Wikipedia上对shader language的解释为“The job of asurface shading procedure is to choose a color for each pixel on a surface, incorporating any variations in color of the surface itself and theeffects of lights that shine on the surface(Marc Olano)”,即,shader language基于物体本⾝属性和光照条件,计算每个像素的颜⾊值。 实际上这种解释具有明显的时代局限性,在GPU编程发展的早期,shader language的提出⽬标是加强对图形处理算法的控制,所以对该语⾔的定义亦针对于此。但随着技术的进步,⽬前的shader language早已经⽤于通⽤计算研究。 shader language被定位为⾼级语⾔,如,HLSL的全称是“High Level Shading Language”,Cg语⾔的全称为“C for Graphic”,并且这两种shader language的语法设计⾮常类似于C语⾔。不过⾼级语⾔的⼀个重要特性是“独⽴于硬件”,在这⼀⽅⾯shader language暂时还做不到,shader language完全依赖于GPU构架,这⼀特征在现阶段是⾮常明显的!任意⼀种shader language都必须基于图形硬件,所以GPU编程技术的发展本质上还是图形硬件的发展。在shader language存在之前,展⽰基于图形硬件的编程能⼒只能靠低级的汇编语⾔。 ⽬前,shader language的发展⽅向是设计出在便捷性⽅⾯可以和C++/JAVA相⽐的⾼级语⾔,“赋予程序员灵活⽽⽅便的编程⽅式”,并“尽可能的控制渲染过程”同时“利⽤图形硬件的并⾏性,提⾼算法的效率”。Shader language⽬前主要有3种语⾔:基于OpenGL的GLSL,基于Direct3D的HLSL,还有NVIDIA公司的Cg 语⾔。 本章的⽬的是阐述shader language的基本原理和运⾏流程,⾸先从硬件的⾓度对Programmable Vertex Processor(可编程顶点处理器,⼜称为顶点着⾊器)和 Programmable Fragment Processor(可编程⽚断处理器,⼜称为⽚断着⾊器)的作⽤进⾏阐述,然后在此基础上对vertex program和fragment program进⾏具体论述,最后对GLSL、HLSL和Cg进⾏⽐较。3.1 Shader Language原理 使⽤shader language编写的程序称之为shader program(着⾊程序)。着⾊程序分为两类:vertex shader program(顶点着⾊程序)和fragment shader program(⽚断着⾊程序)。为了清楚的解释顶点着⾊和⽚断着⾊的含义,我们⾸先从阐述GPU上的两个组件:Programmable Vertex Processor(可编程顶点处理器,⼜称为顶点着⾊器)和 Programmable Fragment Processor(可编程⽚断处理器,⼜称为⽚断着⾊器)。⽂献[2]第1.2.4节中论述到: The vertex and Fragment processing broken out into programmable units. The Programmable vertex processor is the hardware unitthat runs your Cg Vertex programs, whereas the programmable fragment processor is the unit that runs your Cg fragment programs. 这段话的含义是:顶点和⽚段处理器被分离成可编程单元,可编程顶点处理器是⼀个硬件单元,可以运⾏顶点程序,⽽可编程⽚段处理器则是⼀个可以运⾏⽚段程序的单元。顶点和⽚段处理器都拥有⾮常强⼤的并⾏计算能⼒,并且⾮常擅长于矩阵(不⾼于4阶)计算,⽚段处理器还可以⾼速查询纹理信息(⽬前顶点处理器还不⾏,这是顶点处理器的⼀个发展⽅向)。如上所述,顶点程序运⾏在顶点处理器上,⽚段程序运⾏在⽚段处理器上,哪么它们究竟控制了GPU渲染的哪个过程。图 8展⽰了可编程图形渲染管线。

对⽐上⼀章图 3中的GPU渲染管线,可以看出,顶点着⾊器控制顶点坐标转换过程;⽚段着⾊器控制像素颜⾊计算过程。这样就区分出顶点着⾊程序和⽚段着⾊程序的各⾃分⼯:Vertex program负责顶点坐标变换;Fragment program负责像素颜⾊计算;前者的输出是后者的输⼊。 图 9展⽰了现阶段可编程图形硬件的输⼊/输出。输⼊寄存器存放输⼊的图元信息;输出寄存器存放处理后的图元信息;纹理buffer存放纹理数据,⽬前⼤多数的可编程图形硬件只⽀持⽚段处理器处理纹理;从外部宿主程序输⼊的常量放在常量寄存器中;临时寄存器存放着⾊程序在执⾏过程中产⽣的临时数据。 3.2 Vertex Shader Program Vertex shader program(顶点着⾊程序)和Fragment shader program(⽚断着⾊程序)分别被Programmable Vertex Processor(可编程顶点处理器)和 Programmable Fragment Processo(可编程⽚断处理器)所执⾏。 顶点着⾊程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后⽚断着⾊程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应⽤程序传递的纹理信息(如果有的话)进⾏每个⽚断的颜⾊计算,最后将处理后的数据送光栅操作模块。图 10展⽰了在顶点着⾊器和像素着⾊器的数据处理流程。在应⽤程序中设定的图元信息(顶点位置坐标、颜⾊、纹理坐标等)传递到vertex buffer中;纹理信息传递到texture buffer中。其中虚线表⽰⽬前还没有实现的数据传递。当前的顶点程序还不能处理纹理信息,纹理信息只能在⽚断程序中读⼊。顶点着⾊程序与⽚断着⾊程序通常是同时存在,相互配合,前者的输出作为后者的输⼊。不过,也可以只有顶点着⾊程序。如果只有顶点着⾊程序,那么只对输⼊的顶点进⾏操作,⽽顶点内部的点则按照硬件默认的⽅式⾃动插值。例如,输⼊⼀个三⾓⾯⽚,顶点着⾊程序对其进⾏phong光照计算,只计算三个顶点的光照颜⾊,⽽三⾓⾯⽚内部点的颜⾊按照硬件默认的算法(Gourand明暗处理或者快速phong明暗处理)进⾏插值,如果图形硬件⽐较先进,默认的处理算法较好(快速phong明暗处理),则效果也会较好;如果图形硬件使⽤Gourand明暗处理算法,则会出现马赫带效应(条带化)。⽽⽚断着⾊程序是对每个⽚断进⾏独⽴的颜⾊计算,并且算法由⾃⼰编写,不但可控性好,⽽且可以达到更好的效果。 由于GPU对数据进⾏并⾏处理,所以每个数据都会执⾏⼀次shader程序程序。即,每个顶点数据都会执⾏⼀次顶点程序;每个⽚段都会执⾏⼀次⽚段程序。

3.3 Fragment Shader Program ⽚断着⾊程序对每个⽚断进⾏独⽴的颜⾊计算,最后输出颜⾊值的就是该⽚段最终显⽰的颜⾊。可以这样说,顶点着⾊程序主要进⾏⼏何⽅⾯的运算,⽽⽚段着⾊程序主要针对最终的颜⾊值进⾏计算。⽚段着⾊程序还有⼀个突出的特点是:拥有检索纹理的能⼒。对于GPU⽽⾔,纹理等价于数组,这意味着,如果要做通⽤计算,例如数组排序、字符串检索等,就必须使⽤到⽚段着⾊程序。让顶点着⾊器也拥有检索纹理的能⼒,是⽬前的⼀个研究⽅向。 附:什么是⽚断?⽚断和像素有什么不⼀样?所谓⽚断就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值⽐较,⽽屏幕显⽰的像素都是经过深度⽐较的。3.4 CG VS GLSL VS HLSL Shader language⽬前有3种主流语⾔:基于OpenGL的GLSL(OpenGL Shading Language,也称为GLslang),基于Direct3D的HLSL(High Level Shading Language),还有NVIDIA公司的Cg (C for Graphic)语⾔。 GLSL与HLSL分别提基于OpenGL和Direct3D的接⼝,两者不能混⽤,事实上OpenGL和Direct3D⼀直都是冤家对头,曹操和刘备还有⼀段和平共处的甜美时光,但OpenGL和Direct3D各⾃的东家则从来都是争⽃不休。争⽃良久,既然没有分出胜负,那么必然是两败俱伤的局⾯。⾸先ATI系列显卡对OpenGL扩展⽀持不够,例如我在使⽤OSG(Open Scene Graphic)开源图形引擎时,由于该引擎完全基于OpenGL,导致其上编写的3D仿真程序在较⽼的显卡上常常出现纹理⽆法显⽰的问题。其次GLSL 的语法体系⾃成⼀家,⽽HLSL和Cg语⾔的语法基本相同,这就意味着,只要学习HLSL和Cg中的任何⼀种,就等同于学习了两种语⾔。不过OpenGL 毕竟图形API的曾经领袖,通常介绍OpenGL都会附加上⼀句“事实上的⼯业标准”,所以在其长期发展中积累下的⽤户群庞⼤,这些⽤户当然会选择 GLSL学习。此外,GLSL继承了OpenGL的良好移植性,⼀度在unix等操作系统上独领风骚(已是曾经的往事)。 微软的HLSL移植性较差,在windows平台上可谓⼀家独⼤,可⼀出⾃⼰的院⼦(还好院⼦够⼤),就是落地凤凰不如鸡。这⼀点在很⼤程度上限制了 HLSL的推⼴和发展。⽬前HLSL多半都是⽤于游戏领域。我可以负责任的断⾔,在Shader language领域,HLSL可以凭借微软的⽼本成为割据⼀⽅的诸侯,但,决不可能成为君临天下的霸主。这和微软现在的局⾯很像,就是⼀个被带刺鲜花簇拥着的⼤财主,富贵已极,⼨步难⾏。 上⾯两个⼤佬打的很热烈,在这种情况下可以⽤⼀句俗话来形容,“鹬蚌相争,渔翁得利”。NVIDIA是现在当之⽆愧的显卡之王(尤其在AMD兼并ATI之后),是GPU编程理论的奠基者,GeForce系列显卡早已深⼊⼈⼼,它推出的Cg语⾔已经取得了巨⼤的成功,⽣⽣形成了三⾜⿍⽴之势。NVIDIA公司深通⼴告之道,⽬前最流⾏的GPU编程精粹⼀书就出⾃该公司,书中不但介绍了⼤量的GPU前沿知识,最重要的是⼤部分都⽤Cg语⾔实现。凭借该系列的书籍,NVIDIA不光确定了在青年学⼦间的学术地位,⽽且成功的推⼴了Cg语⾔。我本⼈就是使⽤Cg语⾔进⾏研发,基于如下理由: 其⼀,Cg是⼀个可以被OpenGL和Direct3D⼴泛⽀持的图形处理器编程语⾔。 Cg语⾔和OpenGL、DirectX并不是同⼀层次的语⾔,⽽是OpenGL和DirectX的上层,即,Cg程序是运⾏在OpenGL和 DirectX标准顶点和像素着⾊的基础上的; 其⼆,Cg语⾔是Microsoft和NVIDIA相互协作在标准硬件光照语⾔的语法和语义上达成了⼀致,⽂献[1]在1.3.1节的标题就是“Microsoft and NVIDIA’s Collaboration to Develop Cg and HLSL”,所以,HLSL和Cg其实是同⼀种语⾔(参见Cg教程_可编程实时图形权威指南29页的致谢部分)。很多时候,你会发现⽤HLSL写的代码可以直接当中Cg代码使⽤。也就是说,cg基于知识联盟(Microsoft和NVIDIA),且拥有跨平台性,选择cg语⾔是⼤势所趋。有⼼的读者,可以注意市⾯上当前的GPU编程⽅⾯的书籍,⼤都是基于CG语⾔的。(附:Microsoft和NVIDIA联⼿推出Cg,应该是⼀种经济和技术上的双赢,通过这种⽅式联⼿打击GLSL) 此外,Cg,即C for graphics,⽤于图形的C语⾔,这其实说明了当时设计⼈员的⼀个初衷,就是“让基于图形硬件的编程变得和C语⾔编程⼀样⽅便,⾃由”。正如C++和 Java的语法是基于C的,cg语⾔本⾝也是基于C语⾔的。如果您使⽤过C、C++、Java其中任意⼀个,那么Cg的语法也是⽐较容易掌握的。Cg语⾔极⼒保留了C语⾔的⼤部分语义,⼒图让开发⼈员从硬件细节中解脱出来,Cg同时拥有⾼级语⾔的好处,如代码的易重⽤性,可读性提⾼等。使⽤cg还可以实现动画驱动、通⽤计算(排序、查找)等功能。在曾经的⼀段时间中有⼀种流⾔:NVIDIA将要抛弃Cg语⾔。并且在⽹上关于Cg、GLSL、HLSL的优劣讨论中,Cg的跨平台性也受到过⼴泛的质疑。我在2007年12⽉参加朱幼虹⽼师OSG培训班时,他曾专门对Cg、GLSL、HLSL进⾏了⽐较,说道:尽管⽬前还有⼀些关于Cg和GLSL之间的争议,不过主流的3D图形⼚家都开始⽀持Cg语⾔。市场经济的选择可以说明⼀切,时间可以明辨真伪,到2009年末,Cg语⾔不但没有被抛弃,⽽且越来越受欢迎。 我在OGRE官⽅论坛上,搜索过有关使⽤Cg和GLSL的讨论帖⼦,套⽤其中⼀个帖⼦的结尾语来结束本章: In the last year I have never had to write a single HLSL/GLSL shader. Bottom line, I can’t think of any reason NOT to use CG.

2023年6月20日发(作者:)

HLSLGLSLCG着⾊语⾔⽐较摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中⽂名“GPU编程与CG语⾔之阳春⽩雪下⾥巴⼈”

In the last year I have never had to write a single HLSL/GLSL shader. Bottom line, I can’t think of any reason NOT to use CG. shader language,称为着⾊语⾔,shade在英语是阴影、颜⾊深浅的意思,Wikipedia上对shader language的解释为“The job of asurface shading procedure is to choose a color for each pixel on a surface, incorporating any variations in color of the surface itself and theeffects of lights that shine on the surface(Marc Olano)”,即,shader language基于物体本⾝属性和光照条件,计算每个像素的颜⾊值。 实际上这种解释具有明显的时代局限性,在GPU编程发展的早期,shader language的提出⽬标是加强对图形处理算法的控制,所以对该语⾔的定义亦针对于此。但随着技术的进步,⽬前的shader language早已经⽤于通⽤计算研究。 shader language被定位为⾼级语⾔,如,HLSL的全称是“High Level Shading Language”,Cg语⾔的全称为“C for Graphic”,并且这两种shader language的语法设计⾮常类似于C语⾔。不过⾼级语⾔的⼀个重要特性是“独⽴于硬件”,在这⼀⽅⾯shader language暂时还做不到,shader language完全依赖于GPU构架,这⼀特征在现阶段是⾮常明显的!任意⼀种shader language都必须基于图形硬件,所以GPU编程技术的发展本质上还是图形硬件的发展。在shader language存在之前,展⽰基于图形硬件的编程能⼒只能靠低级的汇编语⾔。 ⽬前,shader language的发展⽅向是设计出在便捷性⽅⾯可以和C++/JAVA相⽐的⾼级语⾔,“赋予程序员灵活⽽⽅便的编程⽅式”,并“尽可能的控制渲染过程”同时“利⽤图形硬件的并⾏性,提⾼算法的效率”。Shader language⽬前主要有3种语⾔:基于OpenGL的GLSL,基于Direct3D的HLSL,还有NVIDIA公司的Cg 语⾔。 本章的⽬的是阐述shader language的基本原理和运⾏流程,⾸先从硬件的⾓度对Programmable Vertex Processor(可编程顶点处理器,⼜称为顶点着⾊器)和 Programmable Fragment Processor(可编程⽚断处理器,⼜称为⽚断着⾊器)的作⽤进⾏阐述,然后在此基础上对vertex program和fragment program进⾏具体论述,最后对GLSL、HLSL和Cg进⾏⽐较。3.1 Shader Language原理 使⽤shader language编写的程序称之为shader program(着⾊程序)。着⾊程序分为两类:vertex shader program(顶点着⾊程序)和fragment shader program(⽚断着⾊程序)。为了清楚的解释顶点着⾊和⽚断着⾊的含义,我们⾸先从阐述GPU上的两个组件:Programmable Vertex Processor(可编程顶点处理器,⼜称为顶点着⾊器)和 Programmable Fragment Processor(可编程⽚断处理器,⼜称为⽚断着⾊器)。⽂献[2]第1.2.4节中论述到: The vertex and Fragment processing broken out into programmable units. The Programmable vertex processor is the hardware unitthat runs your Cg Vertex programs, whereas the programmable fragment processor is the unit that runs your Cg fragment programs. 这段话的含义是:顶点和⽚段处理器被分离成可编程单元,可编程顶点处理器是⼀个硬件单元,可以运⾏顶点程序,⽽可编程⽚段处理器则是⼀个可以运⾏⽚段程序的单元。顶点和⽚段处理器都拥有⾮常强⼤的并⾏计算能⼒,并且⾮常擅长于矩阵(不⾼于4阶)计算,⽚段处理器还可以⾼速查询纹理信息(⽬前顶点处理器还不⾏,这是顶点处理器的⼀个发展⽅向)。如上所述,顶点程序运⾏在顶点处理器上,⽚段程序运⾏在⽚段处理器上,哪么它们究竟控制了GPU渲染的哪个过程。图 8展⽰了可编程图形渲染管线。

对⽐上⼀章图 3中的GPU渲染管线,可以看出,顶点着⾊器控制顶点坐标转换过程;⽚段着⾊器控制像素颜⾊计算过程。这样就区分出顶点着⾊程序和⽚段着⾊程序的各⾃分⼯:Vertex program负责顶点坐标变换;Fragment program负责像素颜⾊计算;前者的输出是后者的输⼊。 图 9展⽰了现阶段可编程图形硬件的输⼊/输出。输⼊寄存器存放输⼊的图元信息;输出寄存器存放处理后的图元信息;纹理buffer存放纹理数据,⽬前⼤多数的可编程图形硬件只⽀持⽚段处理器处理纹理;从外部宿主程序输⼊的常量放在常量寄存器中;临时寄存器存放着⾊程序在执⾏过程中产⽣的临时数据。 3.2 Vertex Shader Program Vertex shader program(顶点着⾊程序)和Fragment shader program(⽚断着⾊程序)分别被Programmable Vertex Processor(可编程顶点处理器)和 Programmable Fragment Processo(可编程⽚断处理器)所执⾏。 顶点着⾊程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后⽚断着⾊程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应⽤程序传递的纹理信息(如果有的话)进⾏每个⽚断的颜⾊计算,最后将处理后的数据送光栅操作模块。图 10展⽰了在顶点着⾊器和像素着⾊器的数据处理流程。在应⽤程序中设定的图元信息(顶点位置坐标、颜⾊、纹理坐标等)传递到vertex buffer中;纹理信息传递到texture buffer中。其中虚线表⽰⽬前还没有实现的数据传递。当前的顶点程序还不能处理纹理信息,纹理信息只能在⽚断程序中读⼊。顶点着⾊程序与⽚断着⾊程序通常是同时存在,相互配合,前者的输出作为后者的输⼊。不过,也可以只有顶点着⾊程序。如果只有顶点着⾊程序,那么只对输⼊的顶点进⾏操作,⽽顶点内部的点则按照硬件默认的⽅式⾃动插值。例如,输⼊⼀个三⾓⾯⽚,顶点着⾊程序对其进⾏phong光照计算,只计算三个顶点的光照颜⾊,⽽三⾓⾯⽚内部点的颜⾊按照硬件默认的算法(Gourand明暗处理或者快速phong明暗处理)进⾏插值,如果图形硬件⽐较先进,默认的处理算法较好(快速phong明暗处理),则效果也会较好;如果图形硬件使⽤Gourand明暗处理算法,则会出现马赫带效应(条带化)。⽽⽚断着⾊程序是对每个⽚断进⾏独⽴的颜⾊计算,并且算法由⾃⼰编写,不但可控性好,⽽且可以达到更好的效果。 由于GPU对数据进⾏并⾏处理,所以每个数据都会执⾏⼀次shader程序程序。即,每个顶点数据都会执⾏⼀次顶点程序;每个⽚段都会执⾏⼀次⽚段程序。

3.3 Fragment Shader Program ⽚断着⾊程序对每个⽚断进⾏独⽴的颜⾊计算,最后输出颜⾊值的就是该⽚段最终显⽰的颜⾊。可以这样说,顶点着⾊程序主要进⾏⼏何⽅⾯的运算,⽽⽚段着⾊程序主要针对最终的颜⾊值进⾏计算。⽚段着⾊程序还有⼀个突出的特点是:拥有检索纹理的能⼒。对于GPU⽽⾔,纹理等价于数组,这意味着,如果要做通⽤计算,例如数组排序、字符串检索等,就必须使⽤到⽚段着⾊程序。让顶点着⾊器也拥有检索纹理的能⼒,是⽬前的⼀个研究⽅向。 附:什么是⽚断?⽚断和像素有什么不⼀样?所谓⽚断就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值⽐较,⽽屏幕显⽰的像素都是经过深度⽐较的。3.4 CG VS GLSL VS HLSL Shader language⽬前有3种主流语⾔:基于OpenGL的GLSL(OpenGL Shading Language,也称为GLslang),基于Direct3D的HLSL(High Level Shading Language),还有NVIDIA公司的Cg (C for Graphic)语⾔。 GLSL与HLSL分别提基于OpenGL和Direct3D的接⼝,两者不能混⽤,事实上OpenGL和Direct3D⼀直都是冤家对头,曹操和刘备还有⼀段和平共处的甜美时光,但OpenGL和Direct3D各⾃的东家则从来都是争⽃不休。争⽃良久,既然没有分出胜负,那么必然是两败俱伤的局⾯。⾸先ATI系列显卡对OpenGL扩展⽀持不够,例如我在使⽤OSG(Open Scene Graphic)开源图形引擎时,由于该引擎完全基于OpenGL,导致其上编写的3D仿真程序在较⽼的显卡上常常出现纹理⽆法显⽰的问题。其次GLSL 的语法体系⾃成⼀家,⽽HLSL和Cg语⾔的语法基本相同,这就意味着,只要学习HLSL和Cg中的任何⼀种,就等同于学习了两种语⾔。不过OpenGL 毕竟图形API的曾经领袖,通常介绍OpenGL都会附加上⼀句“事实上的⼯业标准”,所以在其长期发展中积累下的⽤户群庞⼤,这些⽤户当然会选择 GLSL学习。此外,GLSL继承了OpenGL的良好移植性,⼀度在unix等操作系统上独领风骚(已是曾经的往事)。 微软的HLSL移植性较差,在windows平台上可谓⼀家独⼤,可⼀出⾃⼰的院⼦(还好院⼦够⼤),就是落地凤凰不如鸡。这⼀点在很⼤程度上限制了 HLSL的推⼴和发展。⽬前HLSL多半都是⽤于游戏领域。我可以负责任的断⾔,在Shader language领域,HLSL可以凭借微软的⽼本成为割据⼀⽅的诸侯,但,决不可能成为君临天下的霸主。这和微软现在的局⾯很像,就是⼀个被带刺鲜花簇拥着的⼤财主,富贵已极,⼨步难⾏。 上⾯两个⼤佬打的很热烈,在这种情况下可以⽤⼀句俗话来形容,“鹬蚌相争,渔翁得利”。NVIDIA是现在当之⽆愧的显卡之王(尤其在AMD兼并ATI之后),是GPU编程理论的奠基者,GeForce系列显卡早已深⼊⼈⼼,它推出的Cg语⾔已经取得了巨⼤的成功,⽣⽣形成了三⾜⿍⽴之势。NVIDIA公司深通⼴告之道,⽬前最流⾏的GPU编程精粹⼀书就出⾃该公司,书中不但介绍了⼤量的GPU前沿知识,最重要的是⼤部分都⽤Cg语⾔实现。凭借该系列的书籍,NVIDIA不光确定了在青年学⼦间的学术地位,⽽且成功的推⼴了Cg语⾔。我本⼈就是使⽤Cg语⾔进⾏研发,基于如下理由: 其⼀,Cg是⼀个可以被OpenGL和Direct3D⼴泛⽀持的图形处理器编程语⾔。 Cg语⾔和OpenGL、DirectX并不是同⼀层次的语⾔,⽽是OpenGL和DirectX的上层,即,Cg程序是运⾏在OpenGL和 DirectX标准顶点和像素着⾊的基础上的; 其⼆,Cg语⾔是Microsoft和NVIDIA相互协作在标准硬件光照语⾔的语法和语义上达成了⼀致,⽂献[1]在1.3.1节的标题就是“Microsoft and NVIDIA’s Collaboration to Develop Cg and HLSL”,所以,HLSL和Cg其实是同⼀种语⾔(参见Cg教程_可编程实时图形权威指南29页的致谢部分)。很多时候,你会发现⽤HLSL写的代码可以直接当中Cg代码使⽤。也就是说,cg基于知识联盟(Microsoft和NVIDIA),且拥有跨平台性,选择cg语⾔是⼤势所趋。有⼼的读者,可以注意市⾯上当前的GPU编程⽅⾯的书籍,⼤都是基于CG语⾔的。(附:Microsoft和NVIDIA联⼿推出Cg,应该是⼀种经济和技术上的双赢,通过这种⽅式联⼿打击GLSL) 此外,Cg,即C for graphics,⽤于图形的C语⾔,这其实说明了当时设计⼈员的⼀个初衷,就是“让基于图形硬件的编程变得和C语⾔编程⼀样⽅便,⾃由”。正如C++和 Java的语法是基于C的,cg语⾔本⾝也是基于C语⾔的。如果您使⽤过C、C++、Java其中任意⼀个,那么Cg的语法也是⽐较容易掌握的。Cg语⾔极⼒保留了C语⾔的⼤部分语义,⼒图让开发⼈员从硬件细节中解脱出来,Cg同时拥有⾼级语⾔的好处,如代码的易重⽤性,可读性提⾼等。使⽤cg还可以实现动画驱动、通⽤计算(排序、查找)等功能。在曾经的⼀段时间中有⼀种流⾔:NVIDIA将要抛弃Cg语⾔。并且在⽹上关于Cg、GLSL、HLSL的优劣讨论中,Cg的跨平台性也受到过⼴泛的质疑。我在2007年12⽉参加朱幼虹⽼师OSG培训班时,他曾专门对Cg、GLSL、HLSL进⾏了⽐较,说道:尽管⽬前还有⼀些关于Cg和GLSL之间的争议,不过主流的3D图形⼚家都开始⽀持Cg语⾔。市场经济的选择可以说明⼀切,时间可以明辨真伪,到2009年末,Cg语⾔不但没有被抛弃,⽽且越来越受欢迎。 我在OGRE官⽅论坛上,搜索过有关使⽤Cg和GLSL的讨论帖⼦,套⽤其中⼀个帖⼦的结尾语来结束本章: In the last year I have never had to write a single HLSL/GLSL shader. Bottom line, I can’t think of any reason NOT to use CG.