GLSL 向量,着色语言中,向量可以看作是由同样类型的标量组成的,基本类型也分为 bool、int、uint 及 float 等 4 种。每个向量可以由 2 个、3 个 或者 4 个相同的标量组成,具体情况如下所示:
向量类型 | 说明 | 向量类型 | 说明 |
---|---|---|---|
vec2 | 包含了2个浮点数的向量 | bvec2 | 包含了2个布尔数的向量 |
vec3 | 包含了3个浮点数的向量 | bvec3 | 包含了3个布尔数的向量 |
vec4 | 包含了4个浮点数的向量 | bvec4 | 包含了4个布尔数的向量 |
ivec2 | 包含了2个整数的向量 | uvec2 | 包含了2个无符号整数的向量 |
ivec3 | 包含了3个整数的向量 | uvec3 | 包含了3个无符号整数的向量 |
ivec4 | 包含了4个整数的向量 | uvec4 | 包含了4个无符号整数的向量 |
声明向量类型变量的基本语法如下:
vec2 v2; //声明了一个vec2类型的向量
ivec3 v3; //声明了一个ivec3类型的向量
uvec3 vu3; //声明了一个uvec3 类型的向量
bvec4 v4; //声明一个bvec4类型的向量
向量在着色器代码的开发中有十分重要的作用,可以很方便地存储以及操作颜色、位置、纹理坐标等不仅包含一个组成部分的量,也可能需要单独访问向量中的某个分量,基本的语法为“<向量名>.<分量名>”,根据目的的不同,主要有如下几种用法:
- 将一个向量看作颜色时,可以使用r、g、b、a 等4个分量名,其分别代表红、绿、蓝、透明度4个色彩通道,具体用法如下:
aColor.r = 0.6; //给向量aColor的红色通道分量赋值
aColor.g = 0.8; //给向量aColor的绿色通道分量赋值
若向量是四维的,则可以使用的分量名为:r、g、b、a;若向量是三维的,则可以使用的分量名为r、g、b;若是二维的,则仅可以使用r、g两个分量名。
- 将一个向量看作位置时,可以使用x、 y、 z、 w 等 4 个分量名,分别代表 x 轴、y 轴、z轴分量及 w 值,具体用法如下:
aPostion.x = 67.2; //给向量 aPostion 的x分量赋值
aPostion.y = 48.3; //给向量aPostion 的z分量赋值
- 将一个向量看作纹理坐标时,可以使用s、t、p、q 等4个分量名,分别代表纹理坐标的不同分量,具体用法如下;
aTexCoor.s = 0.65; //给向量 aTexCoor 的s 分量赋值
aTexCoor.t = 0.34; //给向量 aTexCoor 的t分量赋值
访问向量中的各个分量不但可以采用 “.”加上不同的分量名,还可以将向量看作一个数组,用下标来进行访问,具体用法如下:
aColor[0] = 0.6; //给向量aColor的红色通道分量赋值
aPostion[2] = 48.3; //给向量aPostion的z轴分量赋值
aTexCoor[1] = 0.34; //给向量aTexCoor的t分量赋值
其实,在 C 语言中也可以通过自己构建结构体的方式来支持向量,但进行向量的运算时必须由 GPU 将每个分量依次顺序计算(3个分量就需要计算3次),效率不高。而着色器中向量则不同,它由硬件原生支持,进行向量的运算时是各分量进行一次完成(n个分量只需要一次计算),效率大大提高。