OpenGl ES GLSL代碼 主要是用于編程頂點著色器和片元著色器的代碼 它可以是以任意后綴的文件名的文件堵泽。但是一般我們都會將其設(shè)定為有意義的后綴名:
shaderv.vsh 頂點著色器代碼 vertext Shaders
shaderf.fsh 片元著色器代碼 fragment Shaders
GLSL 數(shù)據(jù)類型
有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;
//聲明一個思維向量進行構(gòu)造
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的下標(biāo)來獲取值
float x =?v1.x ;
v1.xy = vec2(3.0f,4.0f);
v1.xyz = vec3(3,0f,4,0f,5.0f);
//可以通過顏色設(shè)置rgba
v1.r = 3.0f;
v1.rgba = vec4(1.0,1.0,1.0,1.0);
//可以通過stpq設(shè)置紋理坐標(biāo)
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;
結(jié)構(gòu)體
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;
數(shù)組
??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));
????函數(shù)
函數(shù)的修飾符
in:(沒有指定時,默認(rèn)限定修飾符)绪商,傳遞進入函數(shù)中苛谷,函數(shù)不能對其修改
inout: 傳入相應(yīng)值,可以對其進行修改
out: 函數(shù)返回時可以對其進行修改
vec2 myfunction(in float myfloat,inout vec2 m1,out vec4 m2){
}
vec4 myfunction2 (vec3 m1,vec3 m2,vec3 m3){
}
//GLSL中沒有遞歸函數(shù)
控制語句
一般有if..else else if, while,do while:
if (m1.x < m2.x){
}
else{
}
//循環(huán)只支持while dowhile 不支持for循環(huán)
在OpengL ES GLSL中盡量減少這些循環(huán)格郁,判斷的語句腹殿。
GLSL 精度符
主要有highp高精度,mediump中精度例书,lowp低精度:
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????lowp float a;
medium mat4 m1;
highp vec4 v1;