大家好,接下来将为大家介绍OpenGL ES 3.x 着色器语言:shader language。
1、指定版本
OpenGL ES的顶点着色器和片段着色器的第一行声明GLSL的版本:(如果没有指定,则默认为 1.0版本)。
#version 300 es // 使用3.0版本
2、变量类型
类型 | 说明 |
void | 空类型,即不返回任何值 |
bool | 布尔类型 true,false |
int | 带符号的整数 signed integer |
float | 带符号的浮点数 floating scalar |
vec2, vec3, vec4 | n维浮点数向量 n-component floating point vector |
bvec2, bvec3, bvec4 | n维布尔向量 Boolean vector |
ivec2, ivec3, ivec4 | n维整数向量 signed integer vector |
mat2, mat3, mat4 | 2x2, 3x3, 4x4 浮点数矩阵 float matrix |
sampler2D | 2D纹理 a 2D texture |
samplerCube | 盒纹理 cube mapped texture |
3、变量声明、赋值
OpenGL ES 不支持指针类型。
在 OpenGL ES 中,对于类型转换有很严格的限制,即变量只允许使用相同类型的其它变量进行赋值或其它操作。
标量类型示例:
float mFloat = 1.0;
float mFloat2 = 1; // error: invalid type conversion
bool mBool = true;
int mInt = 0;
int mInt2 = 0.0; // error: invalid type conversion
mFloat = float(mBool); // 正确,bool -> float
mFloat = float(mInt); // 正确,int -> float
mBool = bool(mInt); // 正确,int -> bool
向量类型示例:
vec4 mVec4 = vec4(1.0); // mVec4 = {1.0, 1.0, 1.0, 1.0}
vec3 mVec3 = vec3(1.0, 0.0, 0.5); // mVec3 = {1.0, 0.0, 0.5}
vec3 temp = vec3(mVec3); // temp = mVec3
vec2 mVec2 = vec2(mVec3); // mVec2 = {mVec3.x, mVec3.y}
mVec4 = vec4(mVec2, temp); // mVec4 = {mVec2.x, mVec2.y, temp.x, temp.y}
矩阵类型示例:
矩阵类型的构造函数则更加灵活,规则如下:
1) 如果只提供了一个标量(基本数据类型),则会用这个值填充矩阵的对角线,比如 mat4(1.0) 将会构造一个 4x4 的单位矩阵
2) 可以使用多个向量构造,比如 mat2 可以使用两个 vec2 构造
3) 可以使用多个标量构造
需要注意的是,和平时的写法不同,OpenGL 中的矩阵以列优先的形式排序:
mat3 myMat3 = mat3(1.0, 0.0, 0.0, // 第一列
0.0, 1.0, 0.0, // 第二列
0.0, 1.0, 1.0); // 第三列
4、向量和矩阵分量示例
根据组成 vector 的成员数量,可以通过 {x, y, z, w},{r, g, b, a}, 或 {s, t, p, q} 来访问它的成员,x、r、s 永远指向第一个成员,使用不同的名字仅仅只是为了方便,但不能混合使用,即不能用 ".xgr" 这样的形式。使用示例:
vec3 mVec3 = vec3(0.0, 1.0, 2.0); // mVec3 = {0.0, 1.0, 2.0}
vec3 temp;
temp = mVec3.xyz; // temp = {0.0, 1.0, 2.0}
temp = mVec3.xxx; // temp = {0.0, 0.0, 0.0}
temp = mVec3.zyx; // temp = {2.0, 1.0, 0.0}
也可以使用 "[]" 操作符,需要注意的是,矩阵是以列排序的:
mat4 mMat4 = mat4(1.0); // 初始化对角线的值为 1.0 (单位矩阵)
vec4 col0 = mMat4[0]; // 从矩阵中获取第 0 列向量
float m1_1 = mMat4[1][1]; // 从矩阵中获取元素 [1][1]
float m2_2 = mMat4[2].z; // 从矩阵中获取元素 [2][2]
5、常量示例
常量必须在声明的时候初始化:
const float zero = 0.0;
const float pi = 3.1415926;
const vec4 red = vec4(1.0, 0.0, 0.0, 1.0);
const mat4 identity = mat4(1.0);
const bool mBool = true;
6、结构体示例
struct mixStruct {
vec4 color;
float start;
float end;
int fault;
} mMix; //定义了一个mixStruct的结构体类型和mMix的结构体变量
mMix = mixStruct(vec4(0.0, 1.0, 0.0, 1.0), // color
0.5, // start
2.0, // end
1.0); // fault
7、数组示例
数组声明及初始化:
float floatArray[4];
vec4 vecArray[2];
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);
vec2 c[2] = vec2[2](vec2(1.0), vec2(1.0));
未完续下一节。