OpenGl ES GLSL代码 主要是用于编程顶点着色器和片元着色器的代码 它可以是以任意后缀的文件名的文件。但是一般我们都会将其设定为有意义的后缀名:
shaderv.vsh 顶点着色器代码 vertext Shaders
shaderf.fsh 片元着色器代码 fragment Shaders
GLSL 数据类型
有float,int,uint,bool常见类型,如:
bool bValue = false; //布尔类型
int iValue = 42;//整形leix
uint uiValue = 3929u;//无符号整形
float fValue = 3.14159f;//浮点型
GLSL 变量与变量类型
vec2,vec3,vec42分量、3分量、4分量浮点向量量
ivec2,ivec3,ivec42分量、3分量、4分量量整型向量
uvec2,uvec3,uvec42分量、3分量、4分量⽆符号整型向量
bvec2,bvec3,bvec42分量、3分量、4分量bool型向量
常用的一般是vec2,vec3,vec4存储顶点,颜色,如:
vec4 v1;
//声明一个思维向量进行构造
vec4 v2 = vec4(1.0,1.0,1.0,1.0);
vec4 v;
vec4 vOldPos = vec4(1,2,3,4);
vec4 vOffset = vec4(1,2,3,4);
v = vOldPos + vOffset; //向量相加
v = vNewPos;//向量赋值
v += vec4(10,10,10,10);
v = vOldPos * vOffset; //向量相乘
v *= 5;
//向量元素的获取,可以通过x,y,z,w的下标来获取值
float x = v1.x ;
v1.xy = vec2(3.0f,4.0f);
v1.xyz = vec3(3,0f,4,0f,5.0f);
//可以通过颜色设置rgba
v1.r = 3.0f;
v1.rgba = vec4(1.0,1.0,1.0,1.0);
//可以通过stpq设置纹理坐标
v1.st = vec2(1.0,1.0);
//赋值
v1.s = v1.r;
v1.x = v1.y
v1.r = v1.g;
//向量还支持一次性对所有元素进行赋值
v1.x = v2.x + 5.0;
v1.xyz = v2.xyz + vec3(1.0,2.0,3.0);
矩阵
mat2,mat2x2两⾏两列
mat3,mat3x3三⾏三列
mat4,mat4x4四行四列
mat2x3三⾏行两列
mat2x4四行两列
mat3x2两行三列
mat3x4四行三列
mat4x2两⾏四列
mat4x3三行四列
一般用的较多的是mat2,mat3,mat4。如:
mat4 m1,m2,m3;
mat2 m4;
mat4 m2 = mat4(1.0f,0.0f,0.0f,0.0f,
0.0f,1.0f,0.0f,0.0f,
0.0f,0.0f,1.0f,0.0f,
0.0f,0.0f,0.0f,1.0f);
mat4 m4 = mat4(1.0f);
//矩阵叉乘
m1 = m2 * m4 (必须满足条件,不然会没有意义);
如1列3行 * 3列1行 第一个矩阵的3行,要跟后一个矩阵的3列要一样才有意义,才可以叉乘,否则就没意义了。如(1列3行 * 2列1行 无意义,可以反过来却是有意义,所以要注意顺序的问题)
const
const float a = 0.0f;
结构体
struct forStruct{
vec4 color;
float start;
float end;
}fogVar;
fogVar = fogStruct(vec4(1.0,0.0,0.0,1.0),0.5,2.0);
vec4 color = fogVar.color;
float start = fogVar.start;
数组
float floatArray[4];
vec4 vecArray[2];
float a[4] = float[](1.0,2.0,3.0,4.0);
vec2 c[2] = vec2[2](vec2(1.0,2.0),vec2(3.0,4.0));
函数
函数的修饰符
in:(没有指定时,默认限定修饰符),传递进入函数中,函数不能对其修改
inout: 传入相应值,可以对其进行修改
out: 函数返回时可以对其进行修改
vec2 myfunction(in float myfloat,inout vec2 m1,out vec4 m2){
}
vec4 myfunction2 (vec3 m1,vec3 m2,vec3 m3){
}
//GLSL中没有递归函数
控制语句
一般有if..else else if, while,do while:
if (m1.x < m2.x){
}
else{
}
//循环只支持while dowhile 不支持for循环
在OpengL ES GLSL中尽量减少这些循环,判断的语句。
GLSL 精度符
主要有highp高精度,mediump中精度,lowp低精度:
lowp float a;
medium mat4 m1;
highp vec4 v1;