GLSL語言O(shè)penGLES(三)

前言

前面講解了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 ? a

  • dot()函數(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ù)也可以是矩陣
    公式:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狐肢,一起剝皮案震驚了整個(gè)濱河市添吗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌份名,老刑警劉巖碟联,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異僵腺,居然都是意外死亡鲤孵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門想邦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裤纹,“玉大人,你說我怎么就攤上這事。” “怎么了劫瞳?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵崔赌,是天一觀的道長。 經(jīng)常有香客問我淆珊,道長夺饲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮往声,結(jié)果婚禮上擂找,老公的妹妹穿的比我還像新娘。我一直安慰自己浩销,他們只是感情好贯涎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慢洋,像睡著了一般塘雳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上普筹,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天败明,我揣著相機(jī)與錄音,去河邊找鬼太防。 笑死妻顶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜒车。 我是一名探鬼主播讳嘱,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼醇王!你這毒婦竟也來了呢燥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤寓娩,失蹤者是張志新(化名)和其女友劉穎叛氨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棘伴,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寞埠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焊夸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仁连。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阱穗,靈堂內(nèi)的尸體忽然破棺而出饭冬,到底是詐尸還是另有隱情,我是刑警寧澤揪阶,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布昌抠,位于F島的核電站,受9級(jí)特大地震影響鲁僚,放射性物質(zhì)發(fā)生泄漏炊苫。R本人自食惡果不足惜裁厅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侨艾。 院中可真熱鬧执虹,春花似錦、人聲如沸唠梨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姻成。三九已至插龄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間科展,已是汗流浹背均牢。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留才睹,地道東北人徘跪。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像琅攘,于是被迫代替她去往敵國和親垮庐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容