OpenGL ES 着色器语言:OpenGL ES Shading Language,下面简写为 ES SL 或 SL。
着色器版本指定
#version 300 es
如果没有指定,则默认为 1.00,这是 OpenGL ES 2.0 使用的版本,在 OpenGL ES 3.0 中,制定规范的作者决定匹配 OpenGL ES 和 ES SL 的版本,因此直接从 1.0 跳到了 3.0。
变量类型
标量 | float, int, uint, bool | 基于标量的数据类型 |
---|---|---|
浮点向量 | float, vec2, vec3, vec4 | 分别表示有 1、2、3、4 个成员的浮点向量 |
整型向量 | int, ivec2, ivec3, ivec4 | 分别表示有 1、2、3、4 个成员的整型向量 |
无符号整型向量 | uint, uvec2, uvec3, uvec4 | 分别表示有 1、2、3、4 个成员的无符号整型向量 |
布尔向量 | bool, bvec2, bvec3, bvec4 | 分别表示有 1、2、3、4 个成员的布尔向量 |
矩阵 | mat2 (or mat2x2), mat2x3, mat2x4, mat3x2, mat3 (or mat3x3), mat3x4, mat4x2, mat4x3, mat4 (or mat4x4) | 分别表示 2x2、2x3、…、4x4 矩阵 |
构造函数
在 OpenGL ES SL 中,对于类型转换有很严格的限制,即变量只允许使用相同类型的其它变量进行赋值或其它操作。但 SL 中提供了一些构造函数可以用于类型转换:
float myFloat = 1.0;
float myFloat2 = 1; // 错误,不正确的类型转换
bool myBool = true;
int myInt = 0;
int myInt2 = 0.0; // 错误,不正切的类型转换
myFloat = float(myBool); // 正确,bool -> float
myFloat = float(myInt); // 正确,int -> float
myBool = bool(myInt); // 正确,int -> bool
向量类型的构造函数:
vec4 myVec4 = vec4(1.0); // myVec4 = {1.0, 1.0, 1.0, 1.0}
vec3 myVec3 = vec3(1.0, 0.0, 0.5); // myVec3 = {1.0, 0.0, 0.5}
vec3 temp = vec3(myVec3); // temp = myVec3
vec2 myVec2 = vec2(myVec3); // myVec2 = {myVec3.x, myVec3.y}
myVec4 = vec4(myVec2, temp); // myVec4 = {myVec2.x, myVec2.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,