前言
前面講解了glsl語言的基礎(chǔ)汁展,這里在繼續(xù)學(xué)習(xí)一下opengl es經(jīng)常用到的知識(shí)點(diǎn)浪听,如下:
opengl es系列文章
opengl es之-基礎(chǔ)概念(一)
opengl es之-GLSL語言(二)
opengl es之-GLSL語言(三)
opengl es之-常用函數(shù)介紹(四)
opengl es之-渲染兩張圖片(五)
opengl es之-在圖片上添加對(duì)角線(六)
opengl es之-離屏渲染簡介(七)
opengl es之-CVOpenGLESTextureCache介紹(八)
opengl es之-播放YUV文件(九)
1、變量類型
變量種類 | 變量類型 | 描述 |
---|---|---|
空 | void | 用于無返回值的函數(shù)或者參數(shù)為空的函數(shù) |
標(biāo)量 | float, int, bool | 浮點(diǎn)型与纽,整型,布爾型的標(biāo)量數(shù)據(jù)類型 |
浮點(diǎn)型向量 | vec2, vec3, vec4 | 包含2,3示惊,4個(gè)元素的浮點(diǎn)型向量 |
整數(shù)型向量 | ivec2, ivec3, ivec4 | 包含2,3愉镰,4個(gè)元素的整型向量 |
布爾型向量 | bvec2, bvec3, bvec4 | 包含1涝涤,2,3岛杀,4個(gè)元素的布爾型 |
矩陣 | mat2, mat3, mat4 | 尺寸為2x2阔拳,3x3,4x4的浮點(diǎn)型矩陣 |
紋理句柄 | sampler2D, samplerCube | 分別表示操作2D和cube的句柄 |
備注:GLSL中沒有指針類型类嗤,大小寫敏感的
對(duì)于變量類型糊肠,GLSL有著非常嚴(yán)格的規(guī)則,進(jìn)行賦值遗锣,加減乘除運(yùn)算必須類型一直货裹,否則會(huì)出現(xiàn)語法錯(cuò)誤。如果不一致則必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換
float myFloat = 1.0;
bool myBool = true;
float result = myFloat + myBool(myBool);
2精偿、Structures 結(jié)構(gòu)體
GLSL支持結(jié)構(gòu)體弧圆,把一些系統(tǒng)定義的類型聚到一起,組成自定義的類型笔咽,也可以包括事先聲明的結(jié)構(gòu)體搔预,但是不能定義嵌套結(jié)構(gòu)體。例如:
struct myStruct
{
float f1;
bool f2;
vec3 v3;
}
// 聲明結(jié)構(gòu)體變量
myStruct lightVar2;
struct myStruct2
{
float f1;
myStruct st1; //合法
struct str2{ // 不合法
bool b1;
float f2;
}
}
3叶组、Arrays 數(shù)組
GLSL中的數(shù)組和C的數(shù)組很類似拯田,支持最基本類型,也支持結(jié)構(gòu)體的數(shù)組甩十。例如:
float frequencies[3];
uniform vec4 lightPosition[4];
const int numLights = 2;
light lights[numLights];
//備注 GLSL的數(shù)組無法在聲明的時(shí)候初始化船庇。
4、存儲(chǔ)限定符
const 常量侣监,或者是函數(shù)的只讀參數(shù)
attribute 只能在頂點(diǎn)著色器中定義鸭轮,只讀屬性,由應(yīng)用程序賦值初始化
uniform 只能定義為全局變量橄霉,只讀屬性窃爷,可以由應(yīng)用程序和opengl 初始化
varying 提供頂點(diǎn)著色器和片段著色器的連接點(diǎn),只能是float, vec2, vec3, vec4, mat2, mat3, and mat4類型的變量
5、vector變量操作方式
向量的元素有固定的名字去訪問吞鸭,分別有三組{x,y,z,w}寺董、{r,g,b,a}、{s,t,p,q}刻剥,訪問時(shí)下表對(duì)應(yīng)長度不能超過l向量的長度
vec2 v = vec2(3.0);
v.x //正確
v.z // 錯(cuò)誤
// 向量的元素可以放在一起
vec4 v = vec4(1,2,3,4);
v.zy // 等于 vec2(3,2)
vec3 v3 = v.xyz // 等于vec3(1,2,3)
v.rgba // 此種方式不正確遮咖,下表同時(shí)只能使用一個(gè)集合中的名稱
v.yx = vec2(3,0) // 將y和x的位置互換并給他們的賦值為新的值,將變成 vec4(3,0,3,4);
6造虏、矩陣元素的操作方式
// 用[]訪問元素
mat4 m;
m[1] = vec4(2.0); // sets the 4th element of the third column to 2.0
m[0][0] = 1.0; // sets the upper left element to 1.0
m[2][3] = 2.0; // sets the second column to all 2.0
7御吞、向量和矩陣的操作
vec3 v, u; float f;
v = u + f;
等價(jià)于
v.x = u.x + f;
v.y = u.y + f;
v.z = u.z + f;
vec3 v, u, w;
w = v + u;
等價(jià)于
w.x = v.x + u.x;
w.y = v.y + u.y;
w.z = v.z + u.z;
vec3 v, u;
mat3 m;
u = v * m;
等價(jià)于
u.x = dot(v, m[0]);
u.y = dot(v, m[1]);
u.z = dot(v, m[2]);
u = m * v;
等價(jià)于
u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z; u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z; u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z;
mat m, n, r;
r = m * n;
等價(jià)于
r[0].x = m[0].x * n[0].x + m[1].x * n[0].y + m[2].x * n[0].z;
r[1].x = m[0].x * n[1].x + m[1].x * n[0].y + m[2].y * n[0].z;
r[2].x = m[0].x * n[2].x + m[1].x * n[0].y + m[2].z * n[0].z;
r[0].y = m[0].y * n[0].x + m[1].y * n[1].y + m[2].x * n[1].z;
r[1].y = m[0].y * n[1].x + m[1].y * n[1].y + m[2].y * n[1].z;
r[2].y = m[0].y * n[2].x + m[1].y * n[1].y + m[2].z * n[1].z;
r[0].z = m[0].z * n[0].x + m[1].z * n[2].y + m[2].x * n[2].z;
r[1].z = m[0].z * n[1].x + m[1].z * n[2].y + m[2].y * n[2].z;
r[2].z = m[0].z * n[2].x + m[1].z * n[2].y + m[2].z * n[2].z;
8、常用內(nèi)置函數(shù)
備注:如下函數(shù)的參數(shù)如果不做特殊說明 適用于所有數(shù)據(jù)類型
mix()函數(shù):
功能:像素混合
定義:mix(x,y,a)
公式:x ? (1 – a) + y ? adot()函數(shù):
功能:計(jì)算兩個(gè)元素的乘積
定義:dot(x,y)
公式:x[0] * y[0] + x[1] * y[1] + .......atan()函數(shù):
功能:求反正切值
定義:atan (y, x)或者atan (y/x)
區(qū)別:atan (y, x)與atan (y/x)的區(qū)別漓藕,前者的返回值范圍是[-π,π]陶珠,表示點(diǎn)(x,y)和原點(diǎn)與x軸的夾角;后者為[-π/2,π/2]享钞,表示根據(jù)數(shù)字求出正切角度sqrt()函數(shù):
功能:求平方根
定義:sqrt(x,y)
公式:sin()函數(shù):
功能:求角度的正弦值
定義:sin(x)cos()函數(shù):
功能:求角度的余弦值
定義:cos(x)clamp()函數(shù):
功能:給定一個(gè)范圍[minval,maxval]揍诽,如果x在這個(gè)范圍內(nèi),則返回x栗竖,否則返回接近邊界的minval或者maxval
定義:clamp(x,minVal,maxVal)暑脆,參數(shù)類型為整數(shù)和浮點(diǎn)數(shù)
公式:等價(jià)于min (max (x, minVal), maxVal)mod()函數(shù)
功能:求兩個(gè)數(shù)相除的余數(shù)
定義:mod(x,y),這里x和y可以是普通的數(shù)也可以是矩陣
公式: