GLSL 数值类型

float 单精度浮点数 float f = 10.0;
int 整形 int i = 0;
bool 布尔值 bool isTexture2D = true;
vec2、vec3、vec4 有2、3、4个浮点数元素的矢量 vec4 v4 = vec4( 0.0, 1.0, 0.0, 1.0 )
ivec2、ivec3、ivec4 有2、3、4个整形数元素的矢量
bvec2、bvec3、bvec4 有2、3、4个布尔值元素的矢量
mat2、mat3、mat4 2×2、3×3、4×4 的浮点数元素的矩阵 mat4 e = mat4(
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0 )
在着色器中可这么书写:限定符 类型 变量名

attribute vec2 a_TexCoord; attribute vec4 a_Position; attribute mat4 a_MvpMatrix;

类型转换

int( float ) 把小数部分删除,转为整形 5.99 → 5
int( bool ) true → 1, false → 0
float( int ) 整形数转为浮点数,1 → 1.0
float( bool ) true → 1.0, false → 0.0
bool( int ) 0 → false, 非0 → true
bool( float ) 0.0 → false, 非0.0 → true

矢量、矩阵赋值

构造函数里除了具体的数以外,还可以是矢量和矩阵,矩阵是按照 列主序 排列的。矢量里,如果只传入一个参数, 构造函数会自动的将这个数值赋给所有元素。矩阵里,如果只传入一个参数,生成一个对角矩阵,对角线上都是这个数。但当传入的参数的个数大于1, 又没有达到矢量或矩阵的元素数量时,就会报错。

vec4 v4 = vec4( 1.0 ); // ( 1.0, 1.0, 1.0, 1.0 ); vec3 v3 = vec3( 1.0, 2.0, 3.0); vec2 v2 = vec2( v3 ); // ( 1.0, 2.0 ); vec3 v3a = vec3( v2, 5.0 ); // ( 1.0, 2.0, 5.0 ); vec4 v4a = vec4( v2, v3 ); // ( 1.0, 2.0, 1.0, 2.0 ); vec4 v4b = vec4( v3, v2 ); // ( 1.0, 2.0, 3.0, 1.0 ); vec2 v2a = vec2( 1.0, 2.0 ); vec2 v2b = vec2( 3.0, 4.0 ); mat2 m2a = mat2( v2a, v2b ); // [ 1.0, 3.0 2.0, 4.0 ] vec4 v4c = vec4( 1.0, 0.0, 1.0, 0.0 ); mat2 m2b = mat2( v4c ); // [ 1.0 1.0 0.0 0.0 ] mat2 m2c = mat2( 5.0, v2, 9.0 ); // [ 5.0 2.0 1.0 9.0 ] mat4 e = mat4( 1.0 ); // [ 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 ] mat4 m4 = mat4( 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0 ); [ 1.0 5.0 9.0 13.0 2.0 6.0 10.0 14.0 3.0 7.0 11.0 15.0 4.0 8.0 12.0 16.0 ]

访问元素

用 [] 或 .分量名,来访问矢量的元素。矢量的分量名有: 顶点坐标 x,y,z,w; 颜色 r,g,b,a; 纹理坐标 s,t,p,q。

vec4 v4 = vec4( 0.5, 0.0, 0.3, 1.0); float x = v4.x; // 0.5 float r = v4.b; // 0.3 float t = v4.t; // 0.0 vec2 v2 = v4.xy; // ( 0.5, 0.0 ) vec3 v3 = v4.rgb // ( 0.5, 0.0, 0.3 ) v4.xz = vec2( -1.0, -0.8 ); // ( -1.0, 0.0, -0.8, 1.0 ) mat4 m4 = mat4( 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0 ); v4 = m4[0]; // ( 1.0, 2.0, 3.0, 4.0 ) float f = m4[2][1]; // 10.0

数组

GLSL ES 值支持一维数组,而且不支持 pop()、push() 等操作。声明时,在 [ ] 里填上数组的长度。

float floatArray[1]; // 有1个浮点数元素的数字 vec4 vec4Array[4]; // 有4个vec4矢量的数字

纹理取样器

有两种取样器:访问二维纹理的 sampler2D 和三维纹理的 samplerCube。 取样器只能是 uniform 变量。

uniform sampler2D u_Sampler;