3.4 CG VS GLSL VS HLSL

文章内容源自《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)语言。

GLSLHLSL 分别基于 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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏点滴积累

编程的思想性——议编程与“武功”的一致性

一、缘起        最近做了一件事情,将写好的scala程序中稍显混乱和不雅的代码进行了重构(系列博客见http://www.cnblogs.com/sho...

36350
来自专栏老九学堂

这是一位师兄的算法学习之路

这篇文章讲了什么: 我这些年学习数据结构和算法的总结。 一些不错的算法书籍和教程。 算法的重要性 初学 第一次接触数据结构是在大二下学期的数据结构课程。然而这...

72370
来自专栏Java学习网

给初学编程的人的新年干货

给初学编程的人的新年干货 一、这多东西啥时候能学完? 现在IT新技术日新月异。就常用编程语言而言,有c/c++、汇编、java,c#、Python等;操作系统...

30790
来自专栏Java架构师进阶

当世界上只剩下一个Java程序员

大约在2030年左右, 出现了一个叫做X的语言,它既能做系统级开发(操作系统、数据库、编译器), 也能做服务器端的开发,手机端,Web端都不在话下。

13930
来自专栏zhisheng

给编程初学者的干货:“秘籍”学好一本就不易

一、这多东西啥时候能学完? 现在IT新技术日新月异。就常用编程语言而言,有c/c++、汇编、java,c#、Python等;操作系统平台有Unix/Linux,...

39190
来自专栏码洞

码农群英传连载(一) —— Go 语言之父 Rob Pike

近几年来在计算机语言排行榜上成长最快的语言就是 Go 语言。它勇往直前势如破竹,从几年前的 50 名之外快速跃进前十的宝座,而且还在马不停蹄向上攀登。

13630
来自专栏程序人生

如何从零开始学一门程序语言?

今天一大早排队挂号给孩子看病,耽搁了,现在才发。 说实话,『能花钱的,就不要花时间』是篇即兴之作,本该随着时间被有限的听众渐渐淡忘。但没想到前有 @老赵 微博转...

37660
来自专栏编程

自学iOS开发,从新手小白到高级工程师正确的打开方式

自己目前大四汪一枚,自学iOS开发一年左右,先后学习了swift和Objective-C。由于是自学(而且全院貌似就我一个人在学),深知自学之痛。所以在此分享一...

35580
来自专栏一个会写诗的程序员的博客

《Spring Boot极简教程》附录1 计算机简史附录1 计算机简史1.0 一切皆是映射ABPLTZ1.1 二进制01与易经阴阳1.2 向上抽象封装一层1.3 编程之初:从机械计算机到能接受指令的计

计算机领域中的所有问题,都可以通过向上一层进行抽象封装来解决.这里的封装的本质概念,其实就是”映射“。

20130
来自专栏牛客网

成都银联面经

13940

扫码关注云+社区

领取腾讯云代金券