浏览量:1,515

GLSL与RenderMan、ISL、Cg、HLSL的对比

本文参考【1】第20章,选择性的翻译了其中的部分内容,最后的总结参考【2】中的文章。简单的介绍了着色语言的编年史,以及OpenGL的GLSL着色语言与RenderMan着色语言、ISL、Cg、HLSL四种着色语言的对比。

一. 着色语言编年史

普遍认为Rob Cook和Ken Perlin是第一批开发语言来描述着色计算的人,他们针对的主要是离线渲染系统。Perlin的贡献主要在定义了噪音函数和引入了控制结构,Cook的贡献主要在对着色器的分类上,包括平面着色器、光照着色器、气候着色器等等。人们努力的开发一种能充分描述着色计算的语言,直到Pixar公司推出RenderMan接口规范,达到了一个小巅峰。RenderMan是描述离线渲染系统的着色语言的产业标准,在今天仍旧得到广泛的应用。

第一个交互式着色语言是在北卡罗来纳大学的大规模并行图形系统下得到验证的,该系统名叫PixelFlow,PixelFlow使用到的着色语言是由Marc Olano在1998年描述的。后来,Olano离开北卡,加入SGI公司,定义并且实现了一款运行在OpenGL之上的交互式着色语言,它能使用多通道渲染方法来执行着色器。到了2000年,推出了OpenGL着色器,这是第一款商业上实时的、高级的渲染语言。

OpenGL的GLSL、微软的HLSL、NVIDIA的Cg都是尝试定义商业上可行的、实时的、高级着色语言。3Dlabs的Dave Baldwin在2001年10月推出了描述着色语言的白皮书,就是GLSL。NVIDIA的Cg的规范是在2002年6月推出的,微软的HLSL规范是在2002年11月推出的。

二. RenderMan

在1988年,经过几年的开发,Pixar发布了RenderMan接口规范,这些接口定义了建模程序和渲染程序之间的通行协议,为了能产生照片级真实感质量的图像,原始的目标客户主要动画生产商,后来在电影上也得到应用。

与OpenGL不同的是,它有一整套自己的图形处理管线,不需要太关心交互性和硬件实现。它支持几何图元、层次性建模、相机属性、着色器属性等等,这些与OpenGL着色语言类似。

RenderMan着色语言是RenderMan的组成部分,这种语言也是基于C,能够描述任意的着色器,通过RenderMan接口,把它传输给渲染器。与GLSL类似,可以定义场景中的一些特征,可以计算颜色、位置、透明度等。

GLSL为了能够与当前的商业图形硬件相匹配,抽象出了两种着色器:顶点着色器和片断着色器。而RenderMan抽象出了五类着色器:光照着色器、位移着色器、平面着色器、容量着色器和图像着色器。

两种语言在数据类型的定义上也存在一定的差别。

三. ISL

ISL是Interactive Shading Language的缩写,是描述OpenGL着色器的语言,这里说的OpenGL着色器是第1节中由Olano在2000年推出的产品,它是由SGI开发的软件包,现在已经被淘汰了。OpenGL着色器不仅定义了着色语言(该着色语言称为交互式着色语言),而且定义了一组API,用于定义着色器和在渲染过程中使用它们的方法。

ISL支持平面着色器和光照着色器,在这一点上,与RenderMan更加类似。

ISL用于提供过去的和现有的硬件的可移植性而设计,GLSL用于提供现有的和将来的硬件的可编程而设计。即,如果图形硬件不支持可编程性,就不会支持GLSL语言;相反,ISL能在各种硬件上执行各种特效,包括在不支持或者明显支持编程性的硬件上。

ISL相当是一种汇编语言,不需要底层的硬件的改变,而GLSL需要硬件底层定义相应的功能,GLSL能把高级语言转化为硬件可执行的机器码,高级语言的编译器是由硬件产商生产的,更容易实现编译器的优化。

四. HLSL

HLSL是High-Level Shader Language的缩写,是由微软定义的,在2002年跟DirectX 9一起发布的。与GLSL相类似,它支持顶点着色器(Vertex Shader)和像素着色器(Pixel Shader)。

HLSL的执行环境与GLSL不同,如图1所示。翻译器在DirectX之外,即HLSL程序从来不会直接发送给DirectX 9或者DirectX 10的API上执行。相反,HLSL编译器编译HLSL源码,生成汇编级原码或者二进制程序。

2013-12-20-01

图1 微软的HLSL的执行环境

这种方法的优点是,HLSL程序能够离线编译生成二进制代码,然后再加入到主程序当中,但是在运行时二进制代码仍然需要转化为机器码。GLSL的编译、链接都放到硬件层来实现,给了硬件生产商大量的空间进行着色器优化和体系创新。

HLSL是为DirectX而设计,所有权归微软所有;GLSL是为OpenGL设计,它是一种开放的跨平台标准,改变很少且对以前的版本保持着高度的兼容性。

五. Cg

Cg是C for graphics的缩写,Cg是一种与HLSL相类似的高级着色语言,Cg是由NVIDIA公司定义、实现和支持的。Cg的翻译器能产生DirectX的顶点/像素着色器的汇编代码,或者OpenGL的顶点/片断着色器的汇编代码。用Cg写的着色器既能使用DirectX环境,也能使用OpenGL环境,但是它也要求应用程序调用由NVIDIA提供的图形API,这个库就称为Cg运行库。

2013-12-20-02

图2. Cg的执行环境

六. 总结

参考【2】,GLSL与HLSL分别提基于OpenGL和Direct3D的接口,两者不能混用,事实上OpenGL和Direct3D一直都是冤家对头。争斗良久,既然没有分出胜负,那么必然是两败俱伤的局面。ATI系列显卡对OpenGL扩展支持不够,例如在使用OSG(Open Scene Graphic)开源图形引擎时,由于该引擎完全基于OpenGL,导致其上编写的3D仿真程序在较老的显卡上常常出现纹理无法显示的问题。

此外,Cg是NVIDIA公司推出的着色语言,目前最流行的GPU编程精粹一书就出自NVIDIA公司,书中不但介绍了大量的GPU前沿知识,最重要的是大部分都用Cg语言实现。很多时候,会发现用HLSL写的代码可以直接当中Cg代码使用。也就是说,cg基于知识联盟(Microsoft和NVIDIA),且拥有跨平台性。Microsoft和NVIDIA联手推出Cg,应该是一种经济和技术上的双赢,通过这种方式联手打击GLSL。

七. 参考

【1】《OpenGL Shading Language Third Edition》

【2】http://blog.csdn.net/pizi0475/article/details/6574700

spacer

Leave a reply