1. 序
上一篇文章介绍了着色器语言的数据类型和简单使用,不过没有介绍矢量类型和矩阵类型的访问和运算,它们有很多想通之处,内容相对较多,所以专门用一篇文章来讲述。就先从它们的访问说起
2. 矢量的访问
矢量既可以通过点运算符(.)来访问也可以通过方括号运算符([])来访问
通常矢量通过点运算符来访问,只需要在矢量变量名后接点运算符,然后在接上分量名即可
先来介绍一下矢量的分量名
矢量可以用来存储顶点坐标、颜色和纹理坐标。所以GLSL ES支持以上三种分量名,这样大家在使用的时候便于理解,实际上,一个矢量的x分量或r分量还是s分量都会返回这个矢量的第1个分量,一个矢量的y分量或g分量还是t分量都会返回这个矢量的第2个分量
2.1 单一分量访问
对矢量进行单一访问是可以使用[]操作符通过索引对矢量分量进行访问
2.2 分量组合使用
通过分量名还可以有更多灵活的用法, 例如,可以取任意分量组合,可以逆序使用,可以重复使用,请看以下示例
注意,多个分量名使用时必须属于同一集合,例如不可以使用v3.was
2.3 分量聚合作为左值使用
3. 矩阵的访问
矩阵也是既可以通过点运算符(.)来访问也可以通过方括号运算符([])来访问 通常矩阵通过方括号[] 运算符来访问,使用[]访问矩阵时,类似于访问JavaScript中的二维数组,大家已经知道WebGL中的矩阵是按列主序的,那么通过[0]访问到的是矩阵中第1列元素,通过[1]访问到的是矩阵中第2列元素,请看以下示例
注意,使用[ ]运算符访问矩阵元素时,索引值必须是常量
4. 矢量与矩阵支持的运算符
以上上矢量与矩阵支持的运算符,与基本类型相比,只可以使用==或!=比较运算符,如果确实需要比较矢量或矩阵的大小,可以使用内置函数比较函数
5. 矢量与矩阵的运算
5.1 矢量和数字的运算
矢量和数字的运算,相当于每个分量与该数都做相同的运算,注意矢量分量的类型要与参与运算的数字的类型保持一致,请参照以下示例
5.2 矢量和矢量的运算
矢量和矢量的运算,首先要保证操作矢量的阶数都相同.否则不能计算,计算过程是前一个矢量每个分量与另一个矢量对应的分量做运算,具体请参照以下示例
5.3 矩阵和浮点数的运算
矩阵和浮点数运算,相当于矩阵的每个元素都与该浮点数做运算
以加法为例说明一下,减法、乘法、除法与加法雷同,都是逐元素和浮点数运算
5.4 矩阵和矩阵相乘
矩阵与矩阵相乘计算过程麻烦一些,以三维矩阵与三维矩阵相乘为例说明一下,22矩阵与44矩阵运算过程雷同
注:AB 与 BA 结果是不一样,计算时要注意顺序
5.5 矩阵和右乘矢量
矩阵右乘矢量的结果还是矢量,每个分量都是原矢量中对应的分量,每个分量值为原矢量分量乘上矩阵对应行每个元素然后求和,使用时请参照以下公式
5.6 矩阵和左乘矢量
矩阵左乘矢量同样也是返回一个向量,但与右乘矢量结果完全不同,计算时需要先将这个矢量转置,然后用这个转置后的矢量乘以矩阵,具体参数以下说明