3.著色語(yǔ)言

3.著色語(yǔ)言
OpenGL ES 3.0新增加功能
非方矩陣精拟,全整數(shù)支持鞋喇,插值限定符號(hào)关划,統(tǒng)一變量塊祟偷,局部限定符號(hào),新的內(nèi)建函數(shù)洲鸠,全循環(huán)蝇更,全分支支持以及無(wú)限的著色器指令長(zhǎng)度。

1.向量和變量類型
在計(jì)算機(jī)圖形中遵蚜,兩個(gè)基本數(shù)據(jù)類型組成了變換的基礎(chǔ):向量和矩陣。

5-1 OpenGLES #ORPWA!.png

2.構(gòu)造器
變量可在聲明或者聲明后初始化奈惑,初始化需要構(gòu)造器進(jìn)行吭净,構(gòu)造器也用于類型轉(zhuǎn)換。
變量只能賦值或運(yùn)算為相同類型肴甸,可以避免著色器作者遇到可能導(dǎo)致難以跟蹤的缺陷的意外轉(zhuǎn)換寂殉。

標(biāo)量構(gòu)造器
Int myInt = 0;
float myFloat = 1.0;
myFloat = float(myInt)

向量構(gòu)造器
向量構(gòu)造器的參數(shù)傳遞由兩種基本方法:
1.如果只為向量構(gòu)造器提供一個(gè)標(biāo)量,則該值用于設(shè)置向量的所有值原在。
2.如果提供了多個(gè)標(biāo)量或者向量參數(shù)友扰,則向量的值從左到右使用這些參數(shù)設(shè)置。如果提供了多個(gè)標(biāo)量參數(shù)庶柿,那么在向量中必須有至少和參數(shù)中一樣多的分量村怪。
vec4 myVec4 = vec4(1.0)
//myVec4 = {1.0,1.0,1.0,1.0};

vec3 myVec3 = vec(1.0,0.0,0.5);
vec3 temp = vec3(myVec3);

vec2 myVec2 = vec2(myVec3)
//myVec2 = {1.0,0.0};

myVec4 = vec4(myVec2, temp);
//myVec4 = {myVec2.x,myVec2.y,temp.x,temp.y};

矩陣構(gòu)造器
1.如果只為矩陣構(gòu)造器提供一個(gè)標(biāo)量參數(shù),則該值被放在矩陣的對(duì)角線上浮庐。
2.矩陣可以從多個(gè)向量參數(shù)構(gòu)造甚负。
3.矩陣可以從多個(gè)標(biāo)量參數(shù)構(gòu)造。從左到右使用审残。
mat4 myMat4 = mat4(1);
//myMat4 = {1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1,}
單位矩陣

3.向量和矩陣分量
向量分量可以用“.”和數(shù)組下角標(biāo)
vec3 myvec3 = vec(0,1,2);
vec3 temp;
temp = myvec3.xxx;
//temp = {0,0,0};

矩陣分量
矩陣被看成由一些向量組成梭域。
矩陣單獨(dú)的列可以用數(shù)組下標(biāo)運(yùn)算符[]選擇。
mat4 myMat4 = mat(1.0);
vec4 col0 = myMat4[0];
//col0 = {1,1,1,1};
float m1_1 = myMat4[1][1];
//m1_1 = {1};

4.常量
聲明時(shí)加入const限定符,只讀搅轿,不能在源代碼中修改病涨。
const float zero = 0.0;

5.結(jié)構(gòu)
類似C語(yǔ)言的結(jié)構(gòu)體。
struct fogStruct
{
vec4 color;
float start;
}fogVar
名為fogStruct新的用戶類型和一個(gè)新變量fogVar
結(jié)構(gòu)也可以用構(gòu)造器初始化璧坟。
gogVar = fogStruct(vec4(0,1,0,1),
0.5);

6.數(shù)組
同C類似
數(shù)組構(gòu)造器中的參數(shù)數(shù)量必須等于數(shù)組的大小既穆。

7.運(yùn)算符
同C類似

,1, , , =, =.png

運(yùn)算符只能出現(xiàn)在有相同基本類型的變量之間。
要比較向量沸柔,可以使用內(nèi)建函數(shù)循衰,逐個(gè)分量進(jìn)行比較。

8.函數(shù)
基本同C類似

1.參數(shù)的傳遞方法褐澎。
OpenGL ES著色器語(yǔ)言提供特殊的限定符会钝,定義函數(shù)是否可以修改可變參數(shù)。

(CAMARMMUNIM WENMESNKINN, MMRRN.png

例如vec4 myDunc (inout float myFlost,
out vec4 myVec4,
maat myMat4);
默認(rèn)為in
2.不能使用遞歸
原因是,某些實(shí)現(xiàn)通過吧函數(shù)代碼真正地內(nèi)嵌到為GPU生成的最終程序來(lái)實(shí)施函數(shù)調(diào)用迁酸。著色語(yǔ)言有意地構(gòu)造為允許這種內(nèi)嵌式實(shí)現(xiàn)先鱼,以支持沒有堆棧的GPU。

9.內(nèi)建函數(shù)
方便處理各種計(jì)算任務(wù).例如dot(點(diǎn)積),pow(冪次)

10.控制流語(yǔ)句
類似C
3.0開始完全支持循環(huán)語(yǔ)句奸鬓。但并不是說循環(huán)在性能上沒有什么影響焙畔。

11.統(tǒng)一變量
11.1統(tǒng)一變量存儲(chǔ)應(yīng)用成功通過API傳入著色器的只讀值。
uniform mat4 viewProMatrix
11.2統(tǒng)一變量的命名空間在頂點(diǎn)著色器和片段著色器中都是共享的串远。那么兩個(gè)聲明必須匹配宏多。
11.3存儲(chǔ):統(tǒng)一變量通常保存在硬件中,這個(gè)區(qū)域被稱為“常量存儲(chǔ)”澡罚,試衣鏡中為存儲(chǔ)常量值而分配的特殊空間伸但。

12.統(tǒng)一變量塊
12.1統(tǒng)一變量緩存區(qū)優(yōu)點(diǎn)
統(tǒng)一變量緩存區(qū)數(shù)據(jù)可以在多個(gè)程序中共享,但只需要設(shè)置一次留搔。
統(tǒng)一變量緩存區(qū)對(duì)象一般可以存儲(chǔ)更大量的統(tǒng)一變量數(shù)據(jù)更胖。
在統(tǒng)一緩存區(qū)對(duì)象之間切換比一次單獨(dú)加載一個(gè)統(tǒng)一變量更高效。
12.2 uniform TransformBlock
{
mat4 matViewPoroj;
mat4 matNormaal;
mat4 matTextGen;
}

13.頂點(diǎn)和片段著色器輸入/輸出
13.1頂點(diǎn)輸入是為繪制的每個(gè)頂點(diǎn)指定的數(shù)據(jù)隔显。
應(yīng)用程序?qū)槊總€(gè)頂點(diǎn)創(chuàng)建一個(gè)頂點(diǎn)數(shù)組却妨,該數(shù)組包含位置和顏色。

14.插值限定符
無(wú)插值限定符時(shí)括眠,為執(zhí)行平滑著色彪标。

15.預(yù)處理器和指令
通C類似。
但是宏定義中不能帶有參數(shù)哺窄。

16.統(tǒng)一變量和插值器打包
打包規(guī)則:定義插值器和統(tǒng)一變量映射到物理存儲(chǔ)空間的方式捐下。

17.精度限定符
定義:可以指定著色器變量的計(jì)算精度∶纫担可以聲明為低坷襟,中,高生年。
優(yōu)點(diǎn):運(yùn)行著色器時(shí)可能更快婴程,或者電源效率更高。
缺點(diǎn):在沒有正確使用精度限定符時(shí)可能造成偽像抱婉。
聲明變量時(shí)使用:
highp vec4 position;

默認(rèn)精度使用
Precision heighp float;
頂點(diǎn)著色器中默認(rèn)為最高精度档叔。片段著色器浮點(diǎn)值沒有默認(rèn)的精度值。每個(gè)著色器必須聲明一個(gè)默認(rèn)的float精度蒸绩,或者為每個(gè)float變量指定精度衙四。

18.不變性
在著色器編譯時(shí),可能進(jìn)行導(dǎo)致指令重新排序的優(yōu)化患亿。
invariant
Tip:因?yàn)榫幾g器需要保證不變性传蹈,所以可能限制它所做的優(yōu)化押逼。因此限定符應(yīng)該只在必要時(shí)使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惦界,一起剝皮案震驚了整個(gè)濱河市挑格,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沾歪,老刑警劉巖漂彤,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異灾搏,居然都是意外死亡挫望,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門确镊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)士骤,“玉大人,你說我怎么就攤上這事蕾域。” “怎么了到旦?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵旨巷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我添忘,道長(zhǎng)采呐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任搁骑,我火速辦了婚禮斧吐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仲器。我一直安慰自己煤率,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布乏冀。 她就那樣靜靜地躺著蝶糯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辆沦。 梳的紋絲不亂的頭發(fā)上昼捍,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音肢扯,去河邊找鬼妒茬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蔚晨,可吹牛的內(nèi)容都是我干的乍钻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼团赁!你這毒婦竟也來(lái)了育拨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤欢摄,失蹤者是張志新(化名)和其女友劉穎熬丧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怀挠,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡析蝴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绿淋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷畸。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吞滞,靈堂內(nèi)的尸體忽然破棺而出佑菩,到底是詐尸還是另有隱情,我是刑警寧澤裁赠,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布殿漠,位于F島的核電站,受9級(jí)特大地震影響佩捞,放射性物質(zhì)發(fā)生泄漏绞幌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一一忱、第九天 我趴在偏房一處隱蔽的房頂上張望莲蜘。 院中可真熱鬧,春花似錦帘营、人聲如沸票渠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庄新。三九已至,卻和暖如春薯鼠,著一層夾襖步出監(jiān)牢的瞬間择诈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工出皇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羞芍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓郊艘,卻偏偏與公主長(zhǎng)得像荷科,于是被迫代替她去往敵國(guó)和親唯咬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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