全文摘自
《
GPU Programming And Cg Language Primer 1rd Edition》 康玉之
Shader Language目前有三种语言:
基于OpenGL的GLSL、基于Direct3D的HLSL、NVIDIA公司的Cg。
使用
Shader Language编写的程序称之为shader program。着色程序分为两类:vertex shader program和fragment
shader program
======================================================================================================
GPU上有两个组件:Programmable Vertex Process(可编程顶点处理器,又称顶点着色器)
Programmable Fragment Process(可编程片段处理器,又称片段着色器)
顶点和片段处理器被分离成可编程单元
可编程顶点处理
器
是一个硬件单元,可以运行顶点程序————顶点程序运行在顶点处理器上
可编程片段处理器
是一个可以运行片段程序的单元。————片段程序运行在片段处理器上
Vertex program 负责顶点坐标变换;
Fragment program
负责像素颜色计算;——————前者的输出是后者的输入
顶点和片段处理器都拥有非常强大的并行计算能力,并且非常擅长于矩阵
(不高于4 阶)计算,片段处理器还可以高速查询纹理信息(目前顶点处理器还
不行,这是顶点处理器的一个发展方向)。
=======================================================================================================
可编程图形硬件输入\输出
顶点着色程序从GPU 前端模块(寄存器)中提取图元信息(顶点位置、法
向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等
操作,最后将计算好的数据传送到指定寄存器中;
然后
片断着色程序从中获取需
要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传
递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送
光栅操作模块。
图元信息(顶点位置坐标、颜色、纹理坐标等)传递到vertex buffer 中;
纹
理信息传递到texture buffer 中
也可以只有顶点着色程序。如果只有顶点着色程序,那么只
对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。
片断着色程序是对每个片断进行独立的颜色计算,并且算法由自己编写,
不但可控性好,而且可以达到更好的效果。
由于GPU 对数据进行并行处理,所以每个数据都会执行一次shader 程序程
序。
即,每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。
======================================================================================================
顶点着色程序主要进行几何方面的运算
片
段着色程序主要针对最终的颜色值进行计算。
片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于GPU 而言,
纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,
就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一
个研究方向。
(蓝色字体为不懂的地方,如果可以帮忙答疑解惑,请留言告知,十分感谢!)
附:
什么是片断?片断和像素有什么不一样?所谓片断就是所有的三维顶点
在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素
都是经过深度比较的。
======================================================================================================
GLSL\HLSL\Cg各自特点
GLSL 与HLSL 分别提基于OpenGL 和Direct3D 的接口,两者不能混用
GLSL:
ATI 系列显卡对OpenGL 扩展支持不够
,例如在使用OSG(Open Scene
Graphic)开源图形引擎时,由于该引擎完全基于OpenGL,导致其上编写的3D
仿真程序在较老的显卡上常常出现纹理无法显示的问题
GLSL 的语法体系
自成一家,而HLSL 和Cg 语言的语法基本相同,这就意味着,只要学习HLSL
和Cg 中的任何一种,就等同于学习了两种语言。
GLSL继承了OpenGL 的良好移植性,一度在unix 等操作系统上独领风骚(已是曾经
的往事)。
HLSL:
微软的HLSL 移植性较差
HLSL 多半都是用于游戏领域。我可以负责任的断言,
在Shader language 领域,HLSL 可以凭借微软的老本成为割据一方的诸侯,但,
决不可能成为君临天下的霸主。
Cg:
Cg 是一个可以被OpenGL 和Direct3D 广泛支持的图形处理器编程语
言。
Cg 语言是Microsoft 和NVIDIA 相互协作在标准硬件光照语言的语法
和语义上达成了一致
尽管目前还有一些关于Cg 和GLSL 之间的争议,不过主流
的3D 图形厂家都开始支持Cg 语言。