OpenGL ES 着色器语言基础——数据类型概述(一)

来源:互联网 发布:linux怎么启动oracle 编辑:程序博客网 时间:2024/06/07 22:14

数据类型概述

一、标量 :也被称为“无向量”其值只有大小,并不具有方向。

   标量之间的运算遵循简单的代数法则,如质量、密度、体积、时间以及温度等都属于标量。   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着色语言中,向量可以看做是用同样类型的标量组成,其基本类型也分为boolintfloat三种。   每个向量可以由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方法 }



精彩课程正在更新,敬请期待!

阅读全文
1 0
原创粉丝点击