前言
前面講解了glsl語言的基礎(chǔ),這里在繼續(xù)學(xué)習(xí)一下opengl es經(jīng)常用到的知識點(diǎn),如下:
opengl es系列文章
opengl es之-基礎(chǔ)概念(一)
opengl es之-GLSL語言(二)
opengl es之-GLSL語言(三)
opengl es之-常用函數(shù)介紹(四)
opengl es之-渲染兩張圖片(五)
opengl es之-在圖片上添加對角線(六)
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個元素的浮點(diǎn)型向量 |
| 整數(shù)型向量 | ivec2, ivec3, ivec4 | 包含2,3,4個元素的整型向量 |
| 布爾型向量 | bvec2, bvec3, bvec4 | 包含1,2,3,4個元素的布爾型 |
| 矩陣 | mat2, mat3, mat4 | 尺寸為2x2,3x3,4x4的浮點(diǎn)型矩陣 |
| 紋理句柄 | sampler2D, samplerCube | 分別表示操作2D和cube的句柄 |
備注:GLSL中沒有指針類型,大小寫敏感的
對于變量類型,GLSL有著非常嚴(yán)格的規(guī)則,進(jìn)行賦值,加減乘除運(yùn)算必須類型一直,否則會出現(xiàn)語法錯誤。如果不一致則必須進(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ù)組無法在聲明的時候初始化。
4、存儲限定符
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},訪問時下表對應(yīng)長度不能超過l向量的長度
vec2 v = vec2(3.0);
v.x //正確
v.z // 錯誤
// 向量的元素可以放在一起
vec4 v = vec4(1,2,3,4);
v.zy // 等于 vec2(3,2)
vec3 v3 = v.xyz // 等于vec3(1,2,3)
v.rgba // 此種方式不正確,下表同時只能使用一個集合中的名稱
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;
等價于
v.x = u.x + f;
v.y = u.y + f;
v.z = u.z + f;
vec3 v, u, w;
w = v + u;
等價于
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;
等價于
u.x = dot(v, m[0]);
u.y = dot(v, m[1]);
u.z = dot(v, m[2]);
u = m * v;
等價于
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;
等價于
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ù):
功能:計算兩個元素的乘積
定義: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ù):
功能:給定一個范圍[minval,maxval],如果x在這個范圍內(nèi),則返回x,否則返回接近邊界的minval或者maxval
定義:clamp(x,minVal,maxVal),參數(shù)類型為整數(shù)和浮點(diǎn)數(shù)
公式:等價于min (max (x, minVal), maxVal)mod()函數(shù)
功能:求兩個數(shù)相除的余數(shù)
定義:mod(x,y),這里x和y可以是普通的數(shù)也可以是矩陣
公式: