着色器语言
Open GL ES 着色器语言是一种高级的图形编辑语言,主要特性:
1. OpenGL ES着色器语言是一种高级的过程语言
2. 对顶点着色器,片元着色器使用的是同样的语言,不做区分
3. 基于C/C++的语法及流程控制
4. 完美支持向量与矩阵的各种操作
5. 拥有大量的内置函数来提供丰富的功能
数据类型
OpenGL ES虽然是基于C/C++语法的,但是还是有很大的不同。该语言不支持double,byte,short,long,也取消了C中的union,enum,unsigned以及位运算。
基本数据类型
GLSL有三种基本数据类型:float,int,bool,还有由这三种数据类型组成的数组和结构体
bool b;
int a = 15;
int b = 036;//0开头的字面常量为八进制
int c = 0x3D;//0x开头的字面常量为十六进制
float myFloat = 1.0;
float floatArray[4];
float a[4] = float[](1.0, 2.0, 3.0, 4.0);
float b[4] = float[4](1.0. 2.0, 3.0, 4.0);
int 的取值范围和C中的不同,在GLSL中,int的取值范围是16位精度。
向量
GLSL中,向量可以看做是用同样类型的标量组成,其基本类型也分为bool,int和float三种。每个向量可以由2个,3个或者4个相同的标量组成:
向量类型 | 说明 | 向量类型 | 说明 |
---|---|---|---|
vec2 | 包含了2个浮点数的向量 | ivec4 | 包含了4个整数的向量 |
vec3 | 包含了3个浮点数的向量 | bvec2 | 包含2个布尔数的向量 |
vec4 | 包含了4个浮点数的向量 | bvec3 | 包含了3个布尔数的向量 |
ivec2 | 包含了2个整数的向量 | bvec4 | 包含了4个布尔数的向量 |
ivec3 | 包含了3个整数的向量 |
vec2 v2;
ivec3 v3;
bvec4 v4;
向量在着色器代码的开发中十分重要,可以很方便的存储以及操作颜色,位置,纹理坐标等。也可以单独访问向量中的某个分量,基本语法为< 向量名>.<分量名>
将向量看做颜色时,可以使用r,g,b,a 4个分量名,分别代码红,绿,蓝,透明度
aColor.r = 0.6;
aColor.g = 0,8;将一个向量看做位置时。可以使用x,y,z,w等4个分量名,其分别代表x轴,y轴,z轴,向量的模
aPosition.x = 67.2;
aPosition.z = 34.5;将一个向量看做纹理坐标时,可以使用s,t,p,q 4个分量名,其分别代表纹理坐标中的1维,2维,3维
矩阵
矩阵类型 | 说明 |
---|---|
mat2 | 2x2的浮点数矩阵 |
mat3 | 3x3的浮点数矩阵 |
mat4 | 4x4的浮点数矩阵 |
OpenGL ES着色器语言中,矩阵是按列顺序组织的,也就是一个矩阵可以看做由几个列向量组成。例如,mat3就可以看做由3个vec3组成。
对于矩阵的访问,可以将矩阵作为列向量的数组来访问。如; matrix 为一个mat4,可以使用matrix[2]取到该矩阵的第三列,其为一个vec4;也可以使用matrix[2][2]取得第三列的向量的第三个分量,其为一个float。
GLSL在类型转换方面有非常严格的规则,变量只能赋值给相同类型的其他变量或者与相同类型的变量进行运算。
float myFloat1 = 1.0;
float myFloat2 = 1; // error: invalid type conversion
只能使用构造函数来完成类型换行
float f = 1.0;
bool b = bool(f);
float f1 = float(b);
同样,向量也可以使用构造器,向量构造器的参数传递有两种基本的用法
- 如果只为向量构造器提供一个标量参数,则该值涌来设置向量的所有值
如果提供了多个标量或者向量参数,则向量的值从左到右使用这些参数设置
vec4 myVec4 = vec4(1.0); // {1.0, 1.0, 1.0, .10}
vec3 myVec3 = vec3(1.0, 1.0, 1.0); // {1.0, 1.0, 1.0}
vec3 temp = vec3(myVec3);vec2 myVec2 = vec2(myVec3); // {myVec3.x, myVec3.y}
myVec4 = vec4(myVec2, myVec3); // {myVec2.x, myVec2.y, myVec3.x, myVec3.