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

[]运算符

使用 [] 运算符 + 数组下标也可以访问矢量或矩阵中的元素,注意矩阵中元素是列主序读取,下标是从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()。



《WebGL编程指南》是入门WebGL的绝佳好书,对了解游戏引擎底层渲染原理大有裨益,「奎特尔星球」公众号计划将书中内容拆解成若干篇的知识点笔记,方便大家在碎片时间学习,欢迎你一起学习!


640?wx_fmt=jpeg

  1. GLSL ES 语言—矢量点(.)运算符

  2. GLSL ES 语言—矢量和矩阵的赋值构造函数

  3. GLSL ES 语言—变量数值类型

  4. GLSL ES 语言基础

  5. Creator2.x摄像跟随实现RPG地图

  6. Cocos实现对ETC2的支持

  7. CreatorPrimer|组件编码心得(上)

  8. CreatorPrimer|组件编码心得(中)

  9. CreatorPrimer|组件编码心得(下)

  10. 2D MMO中角色动画的优化总结

640?wx_fmt=png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值