什么是HLSL、GLSL、CG?
在可编程管线出现前,为了编写着色器代码,开发者需要学习汇编语言。
为了给开发者打开方便的大门,就出现了更高级的着色语言。
着色语言是专门用来编写着色器的。
常见的着色语言有
- DirectX的HLSL(Height Lvevl Shading Language)
- OpenGL的GLSL(OpenGL Shading Language)
- Nvdia的CG(C for Graphic)
这种高级是相对汇编来说的,而不是像C#相对于C的高级那样。
这些语言会被编译成和机器无关的汇编语言,也被称为中间语言(Intermediate Language,IL)。
这些中间语言再交给显卡驱动来翻译成真正的机器语言。
GLSL的优点在于他的跨平台性,它可以在Windows,Linux,Mac甚至移动平台等多种平台上工作,但这种跨平台性是由于OpenGL没有提供着色器编译器,而是由显卡驱动来完成着色器的编译工作。
也就是说,只要显卡驱动支持对GLSL的编译就可以运行。
好处在于,由于供应商完全了解自己的硬件构造,他们知道怎么样做可以发挥出最大的作用。
换句话说GLSL是依赖硬件,而非系统层级的,但也意味着GLSL的编译结果取决于硬件供应商,他们对GLSL的编译实现不尽相同,这可能会造成编译结果不一致的情况。
对于HLSL,是由微软控制着色器的编译,就算使用不同的硬件,同一个着色器的编译结果也是一样的(前提是版本相同)。但也因此支持HLSL的平台相对比较有限,几乎全是微软自己的产品Windows,Xbox等。因为在其他平台上没有可以编译HLSL的编译器。
Cg则是真正意义上的跨平台,他会根据平台的不同,编译成相应的中间语言,Cg语言的跨平台性很大原因取决于和微软的合作,这也导致Cg语言的语法和HLSL非常像,Cg语言可以无缝移植成HLSL代码。但缺点是无法完全发挥出OpenGL的最新特性。
对于Unity平台,我们同样可以选择使用哪种语言。在Unity Shader中,我们可以使用“Cg/HLSL”或者"GLSL"。但Unity里的这些着色器语言 并不是真正意义上的对应的着色器语言,尽管他们的语法几乎一样。
来源作者:《UnityShader入门精要》冯乐乐