OpenGl ES GSLS代码笔记

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;

你可能感兴趣的:(OpenGl ES GSLS代码笔记)