数据类型概述:
- 标量 :也被称为“无向量”其值只有大小,并不具有方向。
向量:有方向的量叫做向量。OpenGLES着色语言中,向量可以看做是用同样类型的标量组成,其基本类型也分为bool、int和float三种。 每个 向量可以由2个、3个、4个相同的标量组成。
1.其基本类型也分为bool、int和float三种。 每个向量可以由2个、3个、4个相同的标量组成 2.向量在着色器中的作用可以很方便的存储以及操作颜色、位置、纹理坐标等不仅包含一个组成部分的量。 开发中,有时可能需要单独访问向量中的某个分量,基本的语法为 “<向量名>.<分量名>”。
- 矩阵:
1.矩阵在3D开发中的作用:做位移变换
2.矩阵类型
3.矩阵初始化
mat4*4 是什么意思:第一个值表示列,第二个表示行
初始化矩阵
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关键字进行声明。struct info{ //声明一个结构体 info
vec3 color; //颜色成员
vec3 position; //位置成员
vec2 texturecoor; //纹理坐标成员
}数组:声明数组的方式主要有两种:
1.在声明数组的同时,指定数组的大小。
vec3 position[10];//声明 一个包含10个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.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.函数原型只是给出了函数的形式,但是并没有给出具体的实现内容内置变量
介绍:着色器代码的开发中会用到很多变量,其中大部分可能是由开发人员根据需求自定义的,但着色器中也提供了一些用来满足特性需求的内建变量
特点:
1.内建变量不需要声明就可以使用。 2.一般用来实现 管线渲染固定功能部分 与 自定义顶点 或者 片元着色器 之间的信息交互。
分类(两类):
1、输入变量: 输入变量负责将渲染管线中固定部分产生 的信息传递进着色器 2、输出变量: 输出变量负责将着色器产生的信息传递给渲染管线中固定功 能
名称 | 类型 | 描述 |
---|---|---|
gl_Color | vec4 | 输入属性-表示顶点的主颜色 |
gl_SecondaryColor | vec4 | 输入属性-表示顶点的辅助颜色 |
gl_Normal | vec3 | 输入属性-表示顶点的法线值 |
gl_Vertex | vec4 | 输入属性-表示物体空间的顶点位置 |
gl_MultiTexCoordn | vec4 | 输入属性-表示顶点的第n个纹理的坐标 |
gl_FogCoord | float | 输入属性-表示顶点的雾坐标 |
gl_Position | vec4 | 输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所 有的顶点着色器都必须写这个值。 |
gl_ClipVertex | vec4 | 输出坐标,用于用户裁剪平面的裁剪 |
gl_PointSize | float | 点的大小 |
gl_FrontColor | vec4 | 正面的主颜色的varying输出 |
gl_BackColor | vec4 | 背面主颜色的varying输出 |
gl_FrontSecondaryColor | vec4 | 正面的辅助颜色的varying输出 |
gl_BackSecondaryColor | vec4 | 背面的辅助颜色的varying输出 |
gl_TexCoord[] | vec4 | 纹理坐标的数组varying输出 |
gl_FogFragCoord | float | 雾坐标的varying输出 |
- 片段着色器的内置变量
名称 | 类型 | 描述 |
---|---|---|
gl_Color | vec4 | 包含主颜色的插值只读输入 |
gl_SecondaryColor | vec4 | 包含主颜色的插值只读输入 |
gl_TexCoord[] | vec4 | 包含纹理坐标数组的插值只读输入 |
gl_FogFragCoord | float | 包含雾坐标的插值只读输入 |
gl_FogCoord | vec4 | 只读输入,窗口的x,y,z和1/w |
gl_FrontFacing | bool | 只读输入,如果是窗口正面图元的一部分,则这个值为true |
gl_PointCoord | vec2 | 点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和 点精灵开启的情况下。 |
gl_FragData[] | vec4 | 使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用 |
gl_FragColor | vec4 | 输出的颜色用于随后的像素操作 |
gl_FragDepth | float | 输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替 |