[]运算符
使用 [] 运算符 + 数组下标也可以访问矢量或矩阵中的元素,注意矩阵中元素是列主序读取,下标是从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);
//获取m4矩阵的第1列(1.0, 2,0, 3.0, 4.0)
vec4 v4 = m4[0];
连续使用两个[ ]可以访问某列的某个元素:
float m23 = m4[1][2]; //取4第2列第3个元素(7.0)
还要以使用[ ]和分量名来访问矩阵中的元素:
float m32 = m4[2].y; //取第3列第2个元素(10.0)
常量索引值
这里有一个限制,[ ] 中只能出现的索引必须是常量索引值,定义如下:
整形字面量(如0和1)。
用 const 修饰的全局变量或局部变量,不包括函数参数。
循环索引。
由前述三条中的项组成的表达式。
下例用 const 变量作为访问数组元素的索引:
const int index = 0;
vec4 v4a = m4[index]; //同m4[0]
下例用到了const 组成的表达式为索引:
vec4 v4b = m4[index + 1]; //同m4[1]
不能使用未经const修饰的变量作为索引值,下面代码会出错:
int index2 = 0;
//错误:index2不是常量索引
vec4 v4c = m4[index2];
矢量和矩阵的运算符与基本类型(比如整数)的运算符类似,见下表:
类别 | GLSL ES 数据类型 | 描述 |
---|---|---|
* | 乘法 | 适用于vec2[234]和mat[234] |
/ | 除法 | |
+ | 加法 | 运算的结果数据类型与参与运算的类型相一至 |
- | 减法 | 运算的结果数据类型与参与运算的类型相一至 |
++ | 自增(前缀或后缀) | 适用于vec2[234]和mat[234] |
-- | 自减(前缀或后缀) | 适用于vec2[234]和mat[234] |
= | 赋值 | 适用于vec2[234]和mat[234] |
+=、-=、*=、/= | 运算赋值 | 适用于vec2[234]和mat[234] |
== != | 比较(是否相等) | 适用于vec2[234]和mat[234] |
赋值操作实际是上逐分量地对矩阵和矢量的每一个元素独立赋值,矢量和矩阵只可以使用比较运算符中的 == 和 != :
==:如果两个操作数的每一个分量相同返回true,否则返回false;
!=:如果两个操作数的任何一个分量不同返回true,否则返回true。
需要注意的是,不可以使用 >、<、>=、<=,如果需要比较矩阵大小,需要使用内置函数,比如lessThan()。