为什么英伟达推荐使用glsl或hlsl for windows应用程序的新开发,而不是cg

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

一. 着色语言编年史

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

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

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

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

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

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

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

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

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

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

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

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

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

图1 微软的HLSL的執行环境

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

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

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

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信