使用 . 或 [ ] 运算符访问矢量和矩阵中的元素

. 运算符

在矢量变量名后接点运算符(.),然后使用分量名,访问矢量的元素,矢量的分量名如下表:

分量名 描述
x, y, z, w 获取顶点坐标分量
r, g, b, a 获取颜色分量
s, t, p, q 获取纹理坐标分量

矢量可以用来存储顶点坐标、颜色和纹理坐标,所以 GLSL ES 支持以上三种分量名称以增强程序可读性。任何矢量的 x, r, s 都会返回第 1 个分量,y, g, t 分量都会返回第 2 个分量,比如:

// v3设为(1.0, 2.0, 3.0)

  1. vec3 v3 = vec3(1.0, 2.0, 3.0);

  2. float t;

  3. f = v3.x; // 设置f为1.0

  4. f = v3.y; // 设置f为2.0

  5. f = v3.z; // 设置f为3.0

  6.  

  7. f = v3.r; // 设置f为1.0

  8. f = v3.s; // 设置f为1.0

试图访问超过矢量长度的分量会出错:

// v3不存在第4个元素,w无法访问

  1. f = v3.w;

将多个分量名共同置于点运算符之后,可以从矢量中同时抽取多个分量,这个过程称之为混合,比如:

  1. vec2 v2;

  2. v2 = v3.xy; // 设v2为(1.0, 2.0)

  3. v2 = v3.yz; // 设v2为(2.0, 3.0) 可以省略任意分量

  4. v2 = v3.xz; // 设v2为(1.0, 3.0) 可以跳过任意分量

  5. v2 = v3.yx; // 设v2为(2.0, 1.0) 可以逆序

  6. v2 = v3.xx; // 设v2为(1.0, 1.0) 可以重复任意分量

  7.  

  8. vec3 v3a;

  9. v3a = v3.zyx; // 设v3a为(3.0, 2.0, 1.0) 可使用所有分量

聚合分量名也可以用来作为赋值表达式(=)的左值:

  1. vec4 position = vec4(1.0, 2.0, 3.0, 4.0);

  2. //position为(5.0, 2.0, 3.0, 6.0)

  3. position.xw = vec2(5.0, 6.0);

注意,使用多个分量名必须属于同一集合,比如不能使用v3.was。