GLSL(着色器语言)
变量声明示例:
float a=1.0;
int b=1;
bool c=true;
vec2 d=vec2(1.0,2.0);
vec3 e=vec3(1.0,2.0,3.0)
vec4 f=vec4(vec3,1.2);
vec4 g=vec4(0.2); //相当于vec(0.2,0.2,0.2,0.2)
vec4 h=vec4(a,a,1.3,a);
mat2 i=mat2(0.1,0.5,1.2,2.4);
mat2 j=mat2(0.8); //相当于mat2(0.8,0.8,0.8,0.8)
mat3 k=mat3(e,e,1.2,1.6,1.8);
限定符
在之前的博客中也提到了,GLSL中的限定符号主要有:
- attritude:一般用于各个顶点各不相同的量。如顶点颜色、坐标等。
- uniform:一般用于对于3D物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。
- varying:表示易变量,一般用于顶点着色器传递到片元着色器的量。
- const:常量。
限定符与Java限定符类似,放在变量类型之前,并且只能用于全局变量。在GLSL中,没有默认限定符一说。
函数
GLSL中也可以定义函数,定义函数的方式也与C语言基本相同。函数的返回值可以是GLSL中的除了采样器的任意类型。对于GLSL中函数的参数,可以用参数用途修饰符来进行修饰,常用修饰符如下:
- in:输入参数,无修饰符时默认为此修饰符。
- out:输出参数。
- inout:既可以作为输入参数,又可以作为输出参数。
浮点精度
与顶点着色器不同的是,在片元着色器中使用浮点型时,必须指定浮点类型的精度,否则编译会报错。精度有三种,分别为:
- lowp:低精度。8位。
- mediump:中精度。10位。
- highp:高精度。16位。
具体如下表:
精度 |
浮点范围 |
浮点量级 |
浮点精度 |
整数范围 |
highp |
(−262,262) |
(2−62,262) |
相对:(2−16) |
(−216,216) |
mediump |
(−214,214) |
(2−14,214) |
相对:(2−10) |
(−210,210) |
lowp |
(−2,2) |
(2−8,2) |
绝对:(2−8) |
(−28,28) |
不仅仅是float可以制定精度,其他(除了bool相关)类型也同样可以,但是int、采样器类型并不一定要求指定精度。加精度的定义如下:
uniform lowp float a=1.0;
varying mediump vec4 c;1212
当然,也可以在片元着色器中设置默认精度,只需要在片元着色器最上面加上precision <精度> <类型>
即可制定某种类型的默认精度。其他情况相同的话,精度越高,画质越好,使用的资源也越多。
顶点着色器的内建变量
- 输入变量:
- gl_Position:顶点坐标
- gl_PointSize:点的大小,没有赋值则为默认值1,通常设置绘图为点绘制才有意义。
片元着色器的内建变量
- 输入变量
- gl_FragCoord:当前片元相对窗口位置所处的坐标。
- gl_FragFacing:bool型,表示是否为属于光栅化生成此片元的对应图元的正面。
- 输出变量
- gl_FragColor:当前片元颜色
- gl_FragData:vec4类型的数组。向其写入的信息,供渲染管线的后继过程使用。
常见函数
- radians(x):角度转弧度
- degrees(x):弧度转角度
- sin(x):正弦函数,传入值为弧度。相同的还有cos余弦函数、tan正切函数、asin反正弦、acos反余弦、atan反正切
- pow(x,y):xy
- exp(x):ex
- exp2(x):2x
- log(x):logex
- log2(x):log2x
- sqrt(x):x√
- inversesqr(x):1x√
- abs(x):取x的绝对值
- sign(x):x>0返回1.0,x<0返回-1.0,否则返回0.0
- ceil(x):返回大于或者等于x的整数
- floor(x):返回小于或者等于x的整数
- fract(x):返回x-floor(x)的值
- mod(x,y):取模(求余)
- min(x,y):获取xy中小的那个
- max(x,y):获取xy中大的那个
- mix(x,y,a):返回x∗(1−a)+y∗a
- step(x,a):x< a返回0.0,否则返回1.0
- smoothstep(x,y,a):a < x返回0.0,a>y返回1.0,否则返回0.0-1.0之间平滑的Hermite插值。
- dFdx(p):p在x方向上的偏导数
- dFdy(p):p在y方向上的偏导数
- fwidth(p):p在x和y方向上的偏导数的绝对值之和
几何函数
- length(x):计算向量x的长度
- distance(x,y):返回向量xy之间的距离
- dot(x,y):返回向量xy的点积
- cross(x,y):返回向量xy的差积
- normalize(x):返回与x向量方向相同,长度为1的向量
矩阵函数
- matrixCompMult(x,y):将矩阵相乘
- lessThan(x,y):返回向量xy的各个分量执行x< y的结果,类似的有greaterThan,equal,notEqual
- lessThanEqual(x,y):返回向量xy的各个分量执行x<= y的结果,类似的有类似的有greaterThanEqual
- any(bvec x):x有一个元素为true,则为true
- all(bvec x):x所有元素为true,则返回true,否则返回false
- not(bvec x):x所有分量执行逻辑非运算
纹理采样函数
纹理采样函数有texture2D、texture2DProj、texture2DLod、texture2DProjLod、textureCube、textureCubeLod及texture3D、texture3DProj、texture3DLod、texture3DProjLod等。
- texture表示纹理采样,2D表示对2D纹理采样,3D表示对3D纹理采样
- Lod后缀,只适用于顶点着色器采样
- Proj表示纹理坐标st会除以q
纹理采样函数中,3D在OpenGLES2.0并不是绝对支持。我们再次暂时不管3D纹理采样函数。重点只对texture2D函数进行说明。texture2D拥有三个参数,第一个参数表示纹理采样器。第二个参数表示纹理坐标,可以是二维、三维、或者四维。第三个参数加入后只能在片元着色器中调用,且只对采样器为mipmap类型纹理时有效。