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ǔ):向量和矩陣。
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類似
運(yùn)算符只能出現(xiàn)在有相同基本類型的變量之間。
要比較向量沸柔,可以使用內(nèi)建函數(shù)循衰,逐個(gè)分量進(jìn)行比較。
8.函數(shù)
基本同C類似
1.參數(shù)的傳遞方法褐澎。
OpenGL ES著色器語(yǔ)言提供特殊的限定符会钝,定義函數(shù)是否可以修改可變參數(shù)。
例如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í)使用。