数据类型概述
一、标量 :也被称为“无向量”其值只有大小,并不具有方向。
标量之间的运算遵循简单的代数法则,如质量、密度、体积、时间以及温度等都属于标量。
OpenGL ES着色语言支持的标量类型有布尔型(bool)、整形(int)和浮点型(float)。
//===========语法展示===========
bool b; //声明变量
int a=15; //十进制
int b=036; //八进制(零开头的字面常量为八进制,代表十进制的30)
int c=0x3D;//十六进制(0x开头的字面常量为十六进制,代表十进制的58)
float f; //声明变量
float f=2.5; //在声明变量的同时为变量赋值
float f,h; //同时声明多个变量
float f,h=2.2 , 1.1; //同时声明多个变量.为其中的变量赋初始值
二、向量
OpenGL ES着色语言中,向量可以看做是用同样类型的标量组成,其基本类型也分为bool、int和float三种。
每个向量可以由2个、3个、4个相同的标量组成
向量类型 | 说明 | 向量类型 | 说明 |
vec2 | 包含了2个浮点数的向量 | ivec4 | 包含了4个整数的向量 |
vec3 | 包含了3个浮点数的向量 | bvec2 | 包含了2个布尔数的向量 |
vec4 | 包含了4个浮点数的向量 | bvec3 | 包含了3个布尔数的向量 |
ivec2 | 包含了2个整数的向量 | bvec4 | 包含了4个布尔数的向量 |
ivec3 | 包含了3个整数的向量 |
向量在着色器代码的开发中的作用:
可以很方便的存储以及操作颜色、位置、纹理坐标等不仅包含一个组成部分的量。开发中,有时可能需奥单独访问向量中的某个分量,
基本的语法为 “<向量名>.<分量名>”。
根据目的的不同,主要有以下几种用法:
将一个向量看做颜色时,可以使用r,g,b,a四个分量名,分别代表红、绿、蓝、透明度4个色彩通道。
----------
aColor.r = 0.6; //给向量aColor的红色通道分量赋值
aColor.g = 0.8; //给向量aColor的绿色通道分量赋值
将一个向量看做位置时,可以使用x,y,z,w等4个分量名,分别代表X轴,Y轴,Z轴和向量的模四个分量,具体用法和颜色类似。
----------
aPosition.x = 67.5; //给向量aPosition的x轴分量赋值
aPosition.y = 67.5; //给向量aPosition的y轴分量赋值
将一个向量看做纹理坐标时,可以使用s,t,p,q四个分量名,期分别代表纹理坐标的不同分量,具体用法同颜色。
访问向量中的各个不同的分量不但可以采用“.”加上不同的分量名,还可以将向量看做一个数组,用下标来进行访问,具体用法如下:
----------
aColor[0] = 0.6; //给向量aColor的红色通道分量赋值
aPosition[2] = 48.6; //给向量aPosition的x轴分量赋值
aTexCoor[1] = 0.34; //给向量aTexCoor的t分量赋值
三、矩阵
有一些基础的开发人员都知道,3D场景中的移位、旋转、缩放等变换都是由矩阵的运算来实现的。因此3D场景的开发中会非常多的使用矩阵,矩阵按尺寸分为2x2矩阵、3x3矩阵、4x4矩阵,具体情况如下表所示:
矩阵类型 | 说明 |
mat2 | 2x2浮点数矩阵 |
mat3 | 3x3浮点数矩阵 |
mat4 | 4x4浮点数矩阵 |
-
//==========基本用法==========
mat2 m2; //声明一个mat2类型矩阵
mat3 m3; //声明一个mat3类型矩阵
mat4 m4; //声明一个mat4类型矩阵
OpenGL ES着色语言中,矩阵是按顺序组织的,也就是一个矩阵可以看做由几个列向量组成。 例如:mat3就可以看做由3个vec3组成;
对于矩阵的访问,可以讲矩阵作为列向量的数组来访问。
如matrix为一个mat4,可以使用matrix[2]取到该矩阵的第三列,其为一个vec4;也可以使用matix[2][2]取得第三列向量的第3个分量。
四 采样器
采样器是着色语言中不同于C语言的一种特殊的基本数据类型,其专门用来进行纹理采样的相关操作。一般情况下,一个采样器变量代表一幅或一套纹理贴图,其具体情况如下:
采样器 | 说明 |
sampler2D | 用于访问二维纹理 |
smapler3D | 用于访问三维纹理 |
samplerCube | 用于访问立方贴图纹理 |
需要注意的是,与前面介绍的几种变量不同,采样器变量不能再着色器中初始化。一般情况下采样器变量都用uniform限定符来修饰,从宿主语言(如java)接受传递进着色器的值。
注意:smapler3D并不是所有的OpenGL ES实现中都支持,因此,若要是用首先在着色器代码中进行设置,打开相应拓展。
五、结构体
OpenGL ES着色语言还提供了类似C语言中的用户自定义结构体,同样也是使用struct关键字进行声明。其基本用法如下:
struct info{ //声明一个结构体 info
vec3 color; //颜色成员
vec3 position; //位置成员
vec2 texturecoor; //纹理坐标成员
}
六、数组
声明数组的方式主要有两种:
1.在声明数组的同时,指定数组的大小。
vec3 position[20];//声明 一个包含20个vec3的数组
2.引用数组之前,要再次使用第一种声明方式来生命该数组。
vec3 position[];//声明 一个大小不定的vec3整型数组
vec3 position[5];//再次声明该数组 并指定大小
// (注意:再次声明该数组 并指定大小之后,就不能再进行声明了!)
代码中访问数组的下标都是编译时常量,这时编译器会自动创建适当大小的数组,使得数组尺寸足够存储编译器看到的最大索引值对应的元素。代码如下:
vec3 position[]; //声明了一个大小不定的vec3数组
position[3] = vec3(3.0); //position需要一个大小为4的数组
position[20] = vec3(6.0); //position需要一个大小为21的数组
七、 空类型
空类型使用void表示,仅用来声明不返回任何值得函数。例如在顶点着色器以及片元着色器中必须存在的main函数就是一个返回值为空的函数,代码如下:
void main() {//声明一个空返回值类型的main方法
}