shader学习过程3——shader编程语言

        shader language最初是由汇编语言编写,难度高,入门难。现在由三种高级语言可以编写。

        一 、HLSL

        基于DirectX的High Level Shading Language,简称HLSL。DirectX简称DX,微软的产品。优点:与硬件无关的软件接口,只支持windows平台。

        二、GLSL

        基于OpenGL的OpenGL Shading Language,简称GLSL。优点:与硬件无关的软件接口,最广泛接纳的2D/3D图形API。

缺点,发展迟缓,更新技术少,只支持移动端平台。SGI(美国硅图公司)的产品。

        三、CG

        NVIDIA公司的C for Graphic 简称Cg语言。GLSL与HLSL分别基于OpenGL和Direct3D的接口,两者不能混用,事实上OpenGL和Direct3D一直都是冤家对头,争斗良久。OpenGL在长期发展中积累下的用户群庞大,这些用户胡i选择GLSL学习。GLSL继承了OpenGL的良好移植性,一度在unix等操作系统上独领风骚。但GLSL的语法体系自成一家。微软的HLSL移植性较差,在windows平台上可谓一家独大,这一点在很大程度上限制了HLSL的推广和发展。但是HLSL用于DX的游戏却是深入人心。

                 Cg语言(C for Graphic)是为GPU编程涉及的高级着色器语言,Cg极力保留C语言的大部分语义,并让开发者从硬件细节中解脱出来,Cg同时也由一个高级语言的其他好处,如代码的易重用性,可读性得到提高,编译器代码优化。Cg是一个可以被OpenGL和Direct3D广泛支持的图形处理器编程语言。Cg语言和OpenGL、DirectX并不是同一层次的语言,而是OpenGL和DirectX的上层,即,Cg程序是运行在OpenGL和DirectX标准顶点和像素着色的基础上的。Cg由NVIDIA公司和微软公司相互协作在标准硬件光照语言的语法和语义上达成了一致开发。所以,HLSL和CG其实是一种语言。

            

            学习哪一种语言:如果使用unity做面对安卓和苹果的项目,我们应该选中GLSL的着色器语言,如果有一天项目也需要发布到windows平台或者是Xbox这样的设备上,那么原来写的GLSL代码需要改成HLSL,为了能够避免这样的平台特性,我们可以选择两个平台都支持的CG.  但是我们还有必要学习GLSL 或者HLSL吗?我也很疑惑。。。。。

           unity 里面 CG 跟 HLSL 、GLSL的关系

显卡主要有3个实现商 nv(英伟达) amd intel(英特尔
图形API 实现主要有 pc上 dx, opengl core, vulkan, 移动平台 opengles vulkan Metal
shader 实现主要两个: dx的 hlsl , opengl opengles 的 glsl

nv 为了统一,搞了一个 cg 语法类似hlsl ,但早起只能在nv的卡上跑,现在不知道


        首先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还可以实现动画驱动、通用计算(排序、查找)等功能。

        然后就是unity了
        unity 根据你要跑的不同平台,自动选择了图形API
然后为了统一shader, 自己搞了一个shanderlab, 里面的语法借用了cg
但和nv的cg是两马事
unity 最后会更具你打包的不同平台已经使用的图形API 再把shaderlab的代码生成hlsl或者glsl
unity你选中一个shader,属性窗口里点击gen xxx 可以看到它为不同平台生产单真正shader

     




你可能感兴趣的