一:简介:
OpenGL ES 着色语言是一种高级的图形编程语言.其源自应用广泛的C语言,同时具有RenderMan以及其他编程语言的一些优良特性.
与传统的语言不同的是,他提供了更加丰富的原生类型,比如向量,矩阵等.OpenGL ES着色语言的特性如下:
1.Open GL着色语言是一种高级的过程语言(不是面向对象)
2.对于顶点着色器,片元着色器使用的是同样的语言,不区分.
3.基于C/C++的语法及流程控制
4.完美支持向量与矩阵的各种操作
5.通过类型限定符管理输入和输出
6.拥有大量的内置函数,提供的功能丰富.
有人总结说过,OpenGL ES着色语言是一种易于实现,功能强大,便于使用,完美支持硬件灵活性,并且可以高度并行处理,性能优良的高级图形编程语言.因此,3D开发的话,掌握着色语言就变得尤为重要了.
二:着色语言基础:
虽然OpenGL ES的着色语言是基于C/C++的,但是还是有很多不一样的地方的.比如说,该语言不支持双精度(double),字节型(byte),短整型(short),长整形(long),并且取消了C的联合体(union),
枚举型(enum),无符号整形(unsigned)以及位运算等特点.
1.标量:标量在着色语言中被称为是 无向量 .只有大小,没有方向.运算尊选代数运算.主要类型有三个
布尔型:bool bool b;//申明一个布尔值
整形:int int i;//申明一个整形
浮点型:float float f;//申明一个浮点型
2.向量:可以理解为是用同样类型的标量组成,基本类型为bool,int,float三种.每个向量是有两个,三个,四个相同的标量组成的.
vec2 : 包含两个浮点数的向量;
vec3 : 包含三个浮点数的向量;
vec4 : 包含四个浮点数的向量;
ivec2 :包含两个整形数的向量;
bvec4 : 包含四个布尔型的向量;
特殊的一个点:当把向量看作颜色的时候,可以使用r g b a 四个分量,代表红 绿 蓝 透明度,如:
aColor.r = 0.6 ; //给向量aColor指定红色分量
aColor.a = 0.6 ; //给向量aColor指定透明度分量
当把向量看作坐标位置时可以使用x y z w四个分量,用法如颜色.
当把向量看作纹理坐标时,可以使用s t p q四个分量,用法如颜色.
此处,除了使用 . 作为加分量名外,还可以使用数组的方式实现,如:
aColor[0] = 0.6; // 给向量aColor指定红色分量
需要注意的是,一次只能使用一组分量,比如使用r g b a 的时候,不能混合 x y z w.
3.矩阵:矩阵,平凡用于3D中的旋转,缩放,平移等,因此,矩阵支持就显得很必要了.
mat2 : 2 X 2 的浮点数矩阵;
mat3 : 3 X 3 的浮点数矩阵;
mat4 : 4 X 4 的浮点数矩阵;
在着色语言中,矩阵是按照顺序组织的,也就是说可以看作是几个列向量组成.比如,mat3就是由3个vec3组成的.
在取值的时候,比如matrix是一个mat3的矩阵,那么matrix[1]就渠道的是这个矩阵的第二列,为一个vec3向量.matrix[1][1]取到的是第二行第二列的数,是一个float型.
4.采样器:不同与C语言的基本数据类型,采样器专门用来进行纹理采样.一个采样器代表一副或一套纹理贴图.
sampler2D : 用于访问2维纹理;
sampler3D : 用于访问3维纹理;
samplerCube : 用于访问立方贴图纹理;
5.结构体:自定义结构体,如C语言,关键词使用struct,例如:
struct info {
vec3 color;
vec3 position;
vec2 textureCoor;
}
6.数组:
vec3 position[20] ; //申明一个包含20个vec3的数组
vec3 position[] ; //申明一个大小不固定的数组
postion[3] = vec3(3.0) ; //position的大小需要是4
7.空类型:空类型使用void,例如:
void main() { }