数据类型概述:
-
标量 :也被称为“无向量”其值只有大小,并不具有方向。
-
向量:有方向的量叫做向量。OpenGLES着色语言中,向量可以看做是用同样类型的标量组成,其基本类型也分为bool、int和float三种。 每个 向量可以由2个、3个、4个相同的标量组成。
1.其基本类型也分为bool、int和float三种。 每个向量可以由2个、3个、4个相同的标量组成 2.向量在着色器中的作用可以很方便的存储以及操作颜色、位置、纹理坐标等不仅包含一个组成部分的量。 开发中,有时可能需要单独访问向量中的某个分量,基本的语法为 “<向量名>.<分量名>”。
-
矩阵:
1.矩阵在3D开发中的作用:做位移变换
2.矩阵类型
image
3.矩阵初始化
mat4*4 是什么意思:第一个值表示列,第二个表示行
初始化矩阵
<blockquote>mat3 m=mat3(1.0 , 2.0 ,3.0 , 4.0, 5.0, 6.0, 7.0 ,8.0 , 9.0);
vec3 column1=vec3(1.0 , 2.0 ,3.0 );
vec3 column2=vec3(4.0, 5.0, 6.0 );
mat3 m=mat3(column1,column2 ,column3);
vec2 column1=vec2(1.0 , 2.0 );
vec2 column3=vec2( 7.0 ,8.0 );
mat3 m=mat3(column1 ,3.0 ,column2 ,6.0 ,column3 ,9.0); -
采样器
采样器是着色语言中不同于C语言的一种特殊的基本数据类型,其专门用来进行纹理采样的相关操作。一般情况下,一个采样器变量代表一幅或一套纹理贴图
这里写图片描述
- 结构体
OpenGL ES着色语言还提供了类似C语言中的用户自定义结构体,同样也是使用struct关键字进行声明。
<blockquote>struct info{ //声明一个结构体 info
vec3 color; //颜色成员
vec3 position; //位置成员
vec2 texturecoor; //纹理坐标成员
}
-
数组:声明数组的方式主要有两种:
<blockquote>1.在声明数组的同时,指定数组的大小。
vec3 position[10];//声明 一个包含10个vec3的数组
2.引用数组之前,要再次使用第一种声明方式来生命该数组。
vec3 position[];//声明 一个大小不定的vec3整型数组
vec3 position[5];//再次声明该数组 并指定大小
代码中访问数组的下标都是编译时常量,这时编译器会自动创建适当大小的数组,使得数组尺寸足够存储编译器看到的最大索引值对应的元素。
-
代码如下:
-
<blockquote>vec3 position[];//声明了一个大小不定的vec3数组
position[3] = vec3(3.0); //position需要一个大小为4的数组
position[20] = vec3(6.0); //position需要一个大小为21的数组 -
空类型:空类型使用void表示,仅用来声明不返回任何值得函数。例如在顶点着色器以及片元着色器中必须存在的main函数就是一个返回值为空的函数,代码如下:
<blockquote>void main() {//声明一个空返回值类型的main方法
}
-
类型修饰符
1.attribute 一般用于每个顶点都各不相同的数据,例如:颜色,顶点。。。
- 只有顶点着色器中会有这哥们(attribute )
- 是属性限定符
- 只能用来修饰 浮点数的标量 ,浮点数的向量 , 浮点数的矩阵变量,不能用于修饰其他类型2.uinfrom 一致变量限定符
(一致变量:对同一组顶点组成的单个3D物体中所有的顶点都相同的量)
- 主要出现在顶点和片元 着色器
- 可以修饰所有的基本数据类型3.verying 用来传递顶点着色器中的数据到片元着色器中
例如:
顶点着色器 verying vec2 texture;
片元着色器 verying vec2 texture;4.const 加了这哥们变量值不可变,常量,编译时常量 (编译时常量:在声明的时候要进行初始化,编译器在编译的时候不需要给他分配任何运行时资源。)
例如:
const float PI=3.14;5.in 和out 用in修饰的变量代表的是输入变量,用out修饰的表示输出变量
6.inout 用来修饰参数为输入输出参数,同时具有两种功能! -
GLSL操作符与优先级
-
操作符重载
例如:向量和矩阵之间的乘法 vec3 v;
mat3 m;
vec3 r=v*m;注意:矩阵和向量的维度必须匹配! -
控制流
if(){
}else{
}
switch(){
case : brake;
default:break;
}
- 循环语句
for(int i=0 ;i<10;i++){}
while(){}
do{
}while()
- 流控制语句
brake;
return;
continue;
discard:丢弃当前片元,终止片元着色器执行( 只能在片元着色器中使用,只要运行到该语句,那片元着色器就 会立刻终止) - 函数声明
1.函数声明,变量名需要添加访问修饰符
2.GLSL支持用户自定义函数,同时它定义了一些内置函数
3.函数名称可以是任何字符、数字、下划线,但是不能使用数字,连续下划线或者gl_作为函数的开始
4.返回值可以是任何内置的GLSL类型,或者用户定义的结构体和数组类型。
5.返回值是数组时,必须现实的指定大小。函数返回类型是void则没有返回值
6.函数的参数也可以是任何类型的函数,包括数组(这里数组必须设置大小)
7.在使用一个函数前必须声明他的原型或者直接给出函数体。
8.GLSL的编译器在使用函数前必须找到函数的声明,否则会产生错误
9.函数原型只是给出了函数的形式,但是并没有给出具体的实现内容
网友评论