前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GLSL 语言—矢量和矩阵 [ ] 运算符

GLSL 语言—矢量和矩阵 [ ] 运算符

作者头像
张晓衡
发布2019-09-11 18:12:43
1.5K0
发布2019-09-11 18:12:43
举报
文章被收录于专栏:Creator星球游戏开发社区

[]运算符

使用 [] 运算符 + 数组下标也可以访问矢量或矩阵中的元素,注意矩阵中元素是列主序读取,下标是从0开始:

代码语言:javascript
复制
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];

连续使用两个[ ]可以访问某列的某个元素:

代码语言:javascript
复制
float m23 = m4[1][2]; //取4第2列第3个元素(7.0)

还要以使用[ ]和分量名来访问矩阵中的元素:

代码语言:javascript
复制
float m32 = m4[2].y; //取第3列第2个元素(10.0)

常量索引值

这里有一个限制,[ ] 中只能出现的索引必须是常量索引值,定义如下:

  • 整形字面量(如0和1)。
  • 用 const 修饰的全局变量或局部变量,不包括函数参数。
  • 循环索引。
  • 由前述三条中的项组成的表达式。

下例用 const 变量作为访问数组元素的索引:

代码语言:javascript
复制
const int index = 0;
vec4 v4a = m4[index]; //同m4[0]

下例用到了const 组成的表达式为索引:

代码语言:javascript
复制
vec4 v4b = m4[index + 1]; //同m4[1]

不能使用未经const修饰的变量作为索引值,下面代码会出错:

代码语言:javascript
复制
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()。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Creator星球游戏开发社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • []运算符
  • 常量索引值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档