一、关于着色器
着色器是用来实现图像渲染的,用来替代固定渲染管线的可编程程序。着色器替代了传统的固定渲染管线,可以实现3D图形学计算中的相关计算,由于其可编程性,可以实现各种各样的图像效果而不用受显卡的固定渲染管线限制。这极大的提高了图像的画质。
OpenGLES的着色器语言GLSL是一种高级的图形化编程语言,其源自应用广泛的C语言。与传统的C语言不同的是,它提供了更加丰富的针对于图像处理的原生类型,诸如向量、矩阵之类。GLSL虽然是基于C/C++的语言,但是它和C/C++还是有很大的不同的,比如在GLSL中没有double、long等类型,没有union、enum、unsigned以及位运算等特性。OpenGLES 主要包含以下特性:
GLSL是一种面向过程的语言,和Java的面向对象是不同的。
GLSL的基本语法与C/C++基本相同。
它完美的支持向量和矩阵操作。
它是通过限定符操作来管理输入输出类型的。
GLSL提供了大量的内置函数来提供丰富的扩展功能。
二、数据类型
GLSL中的数据类型主要分为标量、向量、矩阵、采样器、结构体、数组、空类型七种类型:
标量:标量表示的是只有大小没有方向的量,在GLSL中标量只有bool、int和float三种。对于int,和C一样,可以写为十进制(16)、八进制(020)或者十六进制(0x10)。关于进制不了解的,得自己补补,这是编程基础。对于标量的运算,我们最需要注意的是精度,防止溢出问题。
向量:向量我们可以看做是数组,在GLSL通常用于储存颜色、坐标等数据,针对维数,可分为二维、三维和四位向量。针对存储的标量类型,可以分为bool、int和float。共有vec2、vec3、vec4,ivec2、ivec3、ivec4、bvec2、bvec3和bvec4九种类型,数组代表维数、i表示int类型、b表示bool类型。需要注意的是,GLSL中的向量表示竖向量,所以与矩阵相乘进行变换时,矩阵在前,向量在后(与DirectX正好相反)。向量在GPU中由硬件支持运算,比CPU快的多。
作为颜色向量时,用rgba表示分量,就如同取数组的中具体数据的索引值。三维颜色向量就用rgb表示分量。比如对于颜色向量vec4 color,color[0]和color.r都表示color向量的第一个值,也就是红色的分量。其他相同。
作为位置向量时,用xyzw表示分量,xyz分别表示xyz坐标,w表示向量的模。三维坐标向量为xyz表示分量,二维向量为xy表示分量。
作为纹理向量时,用stpq表示分量,三维用stp表示分量,二维用st表示分量。
矩阵:在GLSL中矩阵拥有22、33、4*4三种类型的矩阵,分别用mat2、mat3、mat4表示。我们可以把矩阵看做是一个二维数组,也可以用二维数组下表的方式取里面具体位置的值。
采样器:采样器是专门用来对纹理进行采样工作的,在GLSL中一般来说,一个采样器变量表示一副或者一套纹理贴图。所谓的纹理贴图可以理解为我们看到的物体上的皮肤。
结构体:和C语言中的结构体相同,用struct来定义结构体,关于结构体参考C语言中的结构体。
数组:数组知识也和C中相同,不同的是数组声明时可以不指定大小,但是建议在不必要的情况下,还是指定大小的好。
空类型:空类型用void表示,仅用来声明不返回任何值得函数。
变量声明示例:
float a=1.0; //申明float类型
int b=1; //声明int类型
bool c=true; //声明boolean类型
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 常量
五、流程控制
GLSL中的流程控制与C中基本相同,主要有:
if(){}、if(){}else{}、if(){}else if(){}else{}
while(){}和do{}while()
for(;;){}
break和continue
六、函数
1.常见函数
radians(x):角度转弧度
degrees(x):弧度转角度
sin(x):正弦函数,传入值为弧度。相同的还有cos余弦函数、tan正切函数、asin反正弦、acos反余弦、atan反正切
pow(x,y):xyxy
exp(x):exex
exp2(x):2x2x
log(x):logexlogex
log2(x):log2xlog2x
sqrt(x):x√x
inversesqr(x):1x√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∗ax∗(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方向上的偏导数的绝对值之和
2.几何函数
length(x):计算向量x的长度
distance(x,y):返回向量xy之间的距离
dot(x,y):返回向量xy的点积
cross(x,y):返回向量xy的差积
normalize(x):返回与x向量方向相同,长度为1的向量
3.矩阵函数
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所有分量执行逻辑非运算
4.纹理采样函数
纹理采样函数有texture2D、texture2DProj、texture2DLod、texture2DProjLod、textureCube、textureCubeLod及texture3D、texture3DProj、texture3DLod、texture3DProjLod等。
texture表示纹理采样,2D表示对2D纹理采样,3D表示对3D纹理采样
Lod后缀,只适用于顶点着色器采样
Proj表示纹理坐标st会除以q
七、总结
其实GLSL这块没这么简单,他也是基于c的高级语言,所以这里就大致的记录下,有兴趣还需要好好的研究这门语言。比如一些美颜的效果需要借助这门语言+算法+图像知识。