一、数据类型
1、标量:包含bool、int、float;
2、向量:vec2(浮点二维)、ivec3(整数三维)、bvec4(布尔数四维);
3、矩阵:mat2 (2*2r的浮点数矩阵)、mat3、mat4,可以将矩阵看作二维数组,可以将矩阵作为列向量的数组来访问;
4、采样器:一个采样器变量代表一幅或一套纹理贴图,sampler2D(二维纹理)、sampler3D(三维纹理)、samplerCube(立方贴图纹理);
5、结构体:类型与c语言结构体;
6、数组:可以声明任何类型数组;
7、空类型:void main{}。
二、限定符
1、attribute 限定符:顶点的属性限定符,用于描述顶点的各项特征,如顶点坐标、法向量、颜色、纹理坐标等,只能用于顶点着色器,不能用在片元着色器中,且attribute限定符只用来修饰浮点数标题、浮点数向以及矩阵变量。操作---❶先将属性变量放入缓冲,❷获取对应属性变量的引用,❸通过引用 将缓冲中的数据传入管线,❹启用传入的数据;2、uniform 限定符:为一致变量限定符,指对于同一组顶点组成的单个3d物体中所有顶点都相同的量,如变换矩阵、光源、摄像机位置;3、varying 限定符:易变量,将顶点着色器中的信息传入到片元着色器中;4、const 限定符:编译时常量。
三、特殊的内建变量
1、顶点着色器的内建变量
❶、gl_Position:顶点着色器获得原始的顶点位置数据,在顶点着色器中通过数学变换后生成新的顶点位置,写入gl_Positon传递给渲染管线;
❷、gl_PointSize:顶点着色器中可以计算一个点的大小 。
2、片元着色器中的内建变量
⑴、内建输入变量
❶、gl_FragCoord:含有当前片元相对窗口位置的坐标值x、y、z与1/w。其中x与y分别为片元相对于窗口的二维坐标,z为譔片元的深度值。❷、gl_FrontFacing:布尔型,判断正在处理的片元是否属于在光栅阶段生成此片元的对应图元的正面。其一般用于开发双面光照功能。⑵、内建输出变量
❶、gl_FragColor:用来由片元着色器写入计算完成的片元颜色值;
❷、gl_FragData:vec4类型数组。
四、着色语言的内置函数
1、角度转换与三角函数
radians --- 度转弧度、 degrees --- 弧度转度、 sin、 cos、 tan、 asin、 acos、 atan。
2、指数函数
pow(x,y) --- x的y次方、 exp (x) --- e的x次方、 log(x) --- 以e为底x的对数、 exp2(x) --- 2的x次方、 log2(x) --- 以2为底的x对数、 sqrt(x) --- x的平方根、 inversesqrt(x) -- x正平方根的倒数。
3、常用函数
abs(x) → 求绝对值、 sign(x) → 与0进行比较、 floor(x) → 小于或等于x的最大整数值、 ceil(x) → 大于或等于x的最小整数值、 fract(x) → 返回x-floor(x)的值、mod(x, y) → 取模运算,“x%y”、min、 max、 clamp(x, y, maxVal) → 返回min(max(x, minVal), maxVal)、 mix(x, y, a) → 使用因子a对x与y执行线性混合,返回x*(1-a)+y*a 、step(edge, x) → x与edge比较,大于返回1、smoothstep(edge0, edge1, x) → x<= edge0返回0,x >= edge1 返回1,edge0<x<edge1返回0与1之间平滑的Hermite插值。4、几何函数
length(x) →返回微量x的长度、 distance(p0, p1) → 返回p0与p1之间的距离、 dot(x, y) → 返回向量x与y的点积、 cross(x, y) → 返回向量x与y的叉积、 normalize(x) → 对向量x进行规格化、 faceforward(N, I, Nref) → 根据dot(Nref, I)的值返回相应的值,如果dot(Nref,I)<0则返回N,否则返回-N、reflect(I, N) → 根据入射向量I以及表面法向量N,返回反射方向的向量,N需规格化、 refract(I, N, eta) → 根据入射向量I和表面法向量N以及折射系数eta,返回折射向量,I与N需规格化。
5、矩阵函数
matrixCompMult(x, y) → 按各个部分将矩阵x与矩阵y相乘。
6、向量关系函数
将向量的各个分量进行比较运算,生成标量的布尔值,lessThan(x, y) → 返回x与y中的各个分量执行x<y的结果、 any(x) → 有一个分量为true,返回true、all(x) →全部元素为true则返回true、 not(x) → 各个分量执行逻辑非。7、纹理采样函数
texture2D(sampler, coord, [bias]) → 使用二维纹理坐标coord在由sampler参数指定的2D纹理中执行纹理采样、textureCube(sampler, coord) → 使用纹理坐标coord在由sampler参数指定的立方图纹理中执行纹理采样、texture3D(sampler, coord) → 使用纹理 坐标coord在由sampler指定的3D纹理中执行纹理采样,因2.0不支持,需在着色器开头添加 #extension GL_OES_standard_3d:enable8、微分函数
dFdx(p) → 返回参数p在x方向的偏导数、 dFdy(p) → 返回参数p在y方向的偏导数、 fwidth(p) → 返回在x与y方向偏导数的绝对值之和。
因2.0不支持,需在着色器开头添加 #extension GL_OES_standard_derivatives:enable