GLSL语言
什么是GLSL
GLSL(OpenGL Shading Language)OpenGL着色器语言。
- GLSL基础类型变量:
类型 | 描述 |
---|---|
bool | 布尔类型 |
int | 32位整数 |
float | 32位浮点数 |
-
GLSL聚合类型变量:
2.1 向量: 既有大小,又有方向的量称为向量。(vec(2-4))
向量在着色器中的作用:位置、颜色、纹理2.1.1 标量:只有大小,没有方向的量称为标量。(实际上标量就是实数)
2.1.2 齐次坐标:简而言之,齐次坐标就是用N+1维来代表N维坐标。
我们可以在一个2D笛卡尔坐标末尾加上一个额外的变量w来形成2D齐次坐标,因此,一个点(X,Y)在齐次坐标里面变成了(x,y,w),并且有
X = x/w
Y = y/w
摘自关于齐次坐标的理解(经典)2.1.3 分量访问符
分量访问符 描述 xyzw 坐标访问符 rgba 颜色访问符 stpq 纹理访问符 2.2 矩阵:mat(2-4) GLSL中首先填充列,然后填充行。
矩阵在3D开发中的作用:位移、旋转、缩放
m=mat3(4.0)4.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 4.0 -
GLSL结构体和采样器:
3.1 结构体:同C语言中结构体。
3.2 数组:同C语言中数组。
3.3采样器:进行纹理采样的。
一个采样器代表一套或者一副纹理。
采样器类型 | 说明 |
---|---|
sampler2D | 用来访问2D纹理的 |
sampler3D | 用来访问3D纹理的 |
samplerCube | 立体贴图的纹理 |
注意:① 采样器的变量不能在着色器中初始化,从宿主语言(Android中是Java)接收传递进来的。
② 一般情况下采样器的变量都是用uniform限定符修饰。
③ sampler3D并不是再所有的OpenGLES中支持的,(如果要使用,在着色器代码中打开相应的拓展)
- 类型修饰符:(待修改、补充)
修饰符 | 作用 |
---|---|
attribute | 属性修饰符 ①一般用于顶点变量,例如:顶点,颜色,纹理... ②只用于顶点着色器 ③只能用来修饰浮点数的标量,向量,以及矩阵变量 |
uniform | 一致变量修饰符(什么是一致变量:一致变量是指,对同一组顶点组成的单个3D物体中所有顶点都相同的量) ①可以用在顶点、片段着色器中 ②可以修饰所有的数据类型 |
varing | varying变量是vertex和fragment shader之间做数据传递用的。 ①varying变量在vertex和fragment shader二者之间的声明必须是一致的。 ②application不能使用此变量。 |
const | 修饰的变量不可变(编译时常量) |
in | 设置这个变量为着色器的输入变量 |
out | 设置这个变量为着色器的输出变量 |
inout | 用来修饰的参数为输入输出参数,具有输入输出两种功能 |
-
操作符:同C语言。
-
控制流:同C语言。
-
循环语句:同C语言。
-
流程控制语句:
break
continue
return
disscard:丢弃当前片元,终止片元着色器执行。 -
函数声明:
格式:返回值 函数名(参数列表)
注意:①没有修饰符。②函数名不能数字,连续下划线,gl_开头。 -
内建变量:
10.1 输入内建变量:输入变量负责将渲染管线中固定部分产生的信息传递进着色器。
10.2 输出内建变量:输出变量负责将着色器产生的信息传递给渲染管线中固定功能。gl_Position:顶点着色器中,类型vec4
gl_PointSize:顶点着色器中,float类型,默认为1。
gl_FragColor:vec4类型,由片元着色器写入计算完成的片元颜色值,此颜色值将送入渲染管线的后继阶段经行处理。
gl_FragCoord:片元着色器中,vec4类型向量,中含有当前片元对于窗口位置的坐标值(x、y、z、w)。
gl_FrontFacing:片元着色器中,读取这个内建变量的值可以判断正在处理的片元是否属于在光栅化阶段生成此片元的对应图元的正面。 -
OpenGL渲染管线
OpenGL渲染管线处理数据流程.png