着色器语言(英语:Shader Language)也叫着色语言(英语:Shading Language),是一类专门用来为
着色器编程的
编程语言。这类语言使用“颜色”“
法线”等特殊的
数据类型。由于
三维计算机图形目标市场的
多元化,不同的目标市场通常使用不同的着色器语言。
简介
标量:标量也被称为“无向量”其值只有大小,并不具有方向。标量之间的运算遵循简单的代数法则,如质量、密度、体积、时间以及温度等都属于标量。OpenGLES着色语言支持的标量类型有布尔型(bool)、整形(int)和浮点型(float)。
向量:OpenGLES着色语言中,向量可以看做是用同样类型的标量组成,其基本类型也分为bool、int和float三种。每个向量可以由2个、3个、4个相同的标量组成。具体情况如图一:
向量在着色器代码的开发中有着十分重要的作用,可以很方面的存储以及存储颜色、位置、纹理坐标等不仅包含一个组成部分的量。开发中,有时可能需奥单独访问向量中的某个分量,基本的语法为“<向量名>.<分量名>”,根据目的的不同,主要有以下几种用法:
将一个向量看做颜色时,可以使用r,g,b,a四个分量名,分别代表红、绿、蓝、透明度4个色彩通道。具体用法如下:
将一个向量看做位置时,可以使用x,y,z,w等4个分量名,分别代表X轴,Y轴,Z轴和向量的模四个分量,具体用法和颜色类似。
将一个向量看做纹理坐标时,可以使用s,t,p,q四个分量名,期分别代表纹理坐标的不同分量,具体用法同颜色。(对纹理坐标中的s,t等分量博友可能不是很明白,不用担心,在后面介绍纹理贴图的教程会进行详细的介绍)
访问向量中的各个不同的分量不但可以采用“.”加上不同的分量名,还可以将向量看做一个数组,用下标来进行访问,具体用法如下:
矩阵:有一些基础的开发人员都知道,3D场景中的移位、旋转、缩放等变换都是由矩阵的运算来实现的。因此3D场景的开发中会非常多的使用矩阵,矩阵按尺寸分为2x2矩阵、3x3矩阵、4x4矩阵。具体如图二所示。
对于矩阵的访问,可以讲矩阵作为列向量的数组来访问。如matrix为一个mat4,可以使用matrix[2]取到该矩阵的第三列,其为一个vec4;也可以使用matix[2][2]取得第三列向量的第3个分量。
采样器:采样器是着色语言中不同于C语言的一种特殊的基本数据类型,其专门用来进行纹理采样的相关操作。一般情况下,一个采样器变量代表一幅或一套纹理贴图,具体如图三所示。
结构体:OpenGLES着色语言还提供了类似C语言中的用户自定义结构体,同样也是使用struct关键字进行声明。其基本用法如下:
数组:声明数组的方式主要有两种,在声明数组的同时,指定数组的大小:
在声明数组时,也可以不指定数组的大小,但是必须符合下列两种情况之一。
引用数组之前,要再次使用第一种声明方式来生命该数组:
代码中访问数组的下标都是编译时常量,这时编译器会自动创建适当大小的数组,使得数组尺寸足够存储编译器看到的最大索引值对应的元素。
空类型使用void表示,仅用来声明不返回任何值得函数。例如在
顶点着色器以及片元着色器中必须存在的
main函数就是一个返回值为空的函数,代码如下:
离线渲染
离线渲染领域所使用的着色器语言通常可以生成高质量的图像。这种着色器语言中,对材质属性进行了高度抽象,使用时通常只需少量的编程知识、不需要硬件知识。
这类着色器通常可以达到照片级的效果,但同时需要花费大量时间和算力。因此,这类着色器的最终渲染通常都在
计算机集群上进行。
离线渲染中常见的着色器语言有:
实时渲染
着色器语言在实时计算机图形领域有着广泛应用。与此前常见的硬编码方式相比,这类语言对于硬件抽象的程度很高,同时还给予了程序员更大的灵活性,可以更好地控制整个渲染过程。
由于
串流处理的特点,这类直接在
GPU上运行的着色器也常被用于吞吐量较大的通用数据处理领域。
实时渲染中常见的着色器语言有: