使用 [] 运算符 + 数组下标也可以访问矢量或矩阵中的元素,注意矩阵中元素是列主序读取,下标是从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)
这里有一个限制,[ ] 中只能出现的索引必须是常量索引值,定义如下:
下例用 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] |
赋值操作实际是上逐分量地对矩阵和矢量的每一个元素独立赋值,矢量和矩阵只可以使用比较运算符中的 == 和 != :
需要注意的是,不可以使用 >、<、>=、<=,如果需要比较矩阵大小,需要使用内置函数,比如lessThan()。
本文分享自 Creator星球游戏开发社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!