文章内容源自《GPU编程与CG语言之阳春白雪下里巴人》,因笔者读书易中途放弃,遂每读一章节,将其移至简书平台,以此作为对自己读书的勉励。笔者用粗体、斜体 标注了关键词句,望感兴趣的读者们一起学习共勉。猛戳这里查看更多!
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.