使用 . 或 [ ] 运算符访问矢量和矩阵中的元素
. 运算符
在矢量变量名后接点运算符(.),然后使用分量名,访问矢量的元素,矢量的分量名如下表:
分量名 | 描述 |
---|---|
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)
-
vec3 v3 = vec3(1.0, 2.0, 3.0);
-
float t;
-
f = v3.x; // 设置f为1.0
-
f = v3.y; // 设置f为2.0
-
f = v3.z; // 设置f为3.0
-
-
f = v3.r; // 设置f为1.0
-
f = v3.s; // 设置f为1.0
试图访问超过矢量长度的分量会出错:
// v3不存在第4个元素,w无法访问
-
f = v3.w;
将多个分量名共同置于点运算符之后,可以从矢量中同时抽取多个分量,这个过程称之为混合,比如:
-
vec2 v2;
-
v2 = v3.xy; // 设v2为(1.0, 2.0)
-
v2 = v3.yz; // 设v2为(2.0, 3.0) 可以省略任意分量
-
v2 = v3.xz; // 设v2为(1.0, 3.0) 可以跳过任意分量
-
v2 = v3.yx; // 设v2为(2.0, 1.0) 可以逆序
-
v2 = v3.xx; // 设v2为(1.0, 1.0) 可以重复任意分量
-
-
vec3 v3a;
-
v3a = v3.zyx; // 设v3a为(3.0, 2.0, 1.0) 可使用所有分量
聚合分量名也可以用来作为赋值表达式(=)的左值:
-
vec4 position = vec4(1.0, 2.0, 3.0, 4.0);
-
//position为(5.0, 2.0, 3.0, 6.0)
-
position.xw = vec2(5.0, 6.0);
注意,使用多个分量名必须属于同一集合,比如不能使用v3.was。