一、關(guān)于著色器
著色器是用來(lái)實(shí)現(xiàn)圖像渲染的,用來(lái)替代固定渲染管線的可編程程序。著色器替代了傳統(tǒng)的固定渲染管線,可以實(shí)現(xiàn)3D圖形學(xué)計(jì)算中的相關(guān)計(jì)算,由于其可編程性,可以實(shí)現(xiàn)各種各樣的圖像效果而不用受顯卡的固定渲染管線限制。這極大的提高了圖像的畫質(zhì)。
OpenGLES的著色器語(yǔ)言GLSL是一種高級(jí)的圖形化編程語(yǔ)言,其源自應(yīng)用廣泛的C語(yǔ)言。與傳統(tǒng)的C語(yǔ)言不同的是,它提供了更加豐富的針對(duì)于圖像處理的原生類型,諸如向量、矩陣之類。GLSL雖然是基于C/C++的語(yǔ)言,但是它和C/C++還是有很大的不同的,比如在GLSL中沒(méi)有double、long等類型,沒(méi)有union、enum、unsigned以及位運(yùn)算等特性。OpenGLES 主要包含以下特性:
GLSL是一種面向過(guò)程的語(yǔ)言,和Java的面向?qū)ο笫遣煌摹?br>
GLSL的基本語(yǔ)法與C/C++基本相同。
它完美的支持向量和矩陣操作。
它是通過(guò)限定符操作來(lái)管理輸入輸出類型的。
GLSL提供了大量的內(nèi)置函數(shù)來(lái)提供豐富的擴(kuò)展功能。
二、數(shù)據(jù)類型
GLSL中的數(shù)據(jù)類型主要分為標(biāo)量、向量、矩陣、采樣器、結(jié)構(gòu)體、數(shù)組、空類型七種類型:
標(biāo)量:標(biāo)量表示的是只有大小沒(méi)有方向的量,在GLSL中標(biāo)量只有bool、int和float三種。對(duì)于int,和C一樣,可以寫為十進(jìn)制(16)、八進(jìn)制(020)或者十六進(jìn)制(0x10)。關(guān)于進(jìn)制不了解的,得自己補(bǔ)補(bǔ),這是編程基礎(chǔ)。對(duì)于標(biāo)量的運(yùn)算,我們最需要注意的是精度,防止溢出問(wèn)題。
向量:向量我們可以看做是數(shù)組,在GLSL通常用于儲(chǔ)存顏色、坐標(biāo)等數(shù)據(jù),針對(duì)維數(shù),可分為二維、三維和四位向量。針對(duì)存儲(chǔ)的標(biāo)量類型,可以分為bool、int和float。共有vec2、vec3、vec4,ivec2、ivec3、ivec4、bvec2、bvec3和bvec4九種類型,數(shù)組代表維數(shù)、i表示int類型、b表示bool類型。需要注意的是,GLSL中的向量表示豎向量,所以與矩陣相乘進(jìn)行變換時(shí),矩陣在前,向量在后(與DirectX正好相反)。向量在GPU中由硬件支持運(yùn)算,比CPU快的多。
作為顏色向量時(shí),用rgba表示分量,就如同取數(shù)組的中具體數(shù)據(jù)的索引值。三維顏色向量就用rgb表示分量。比如對(duì)于顏色向量vec4 color,color[0]和color.r都表示color向量的第一個(gè)值,也就是紅色的分量。其他相同。
作為位置向量時(shí),用xyzw表示分量,xyz分別表示xyz坐標(biāo),w表示向量的模。三維坐標(biāo)向量為xyz表示分量,二維向量為xy表示分量。
作為紋理向量時(shí),用stpq表示分量,三維用stp表示分量,二維用st表示分量。
矩陣:在GLSL中矩陣擁有22、33、4*4三種類型的矩陣,分別用mat2、mat3、mat4表示。我們可以把矩陣看做是一個(gè)二維數(shù)組,也可以用二維數(shù)組下表的方式取里面具體位置的值。
采樣器:采樣器是專門用來(lái)對(duì)紋理進(jìn)行采樣工作的,在GLSL中一般來(lái)說(shuō),一個(gè)采樣器變量表示一副或者一套紋理貼圖。所謂的紋理貼圖可以理解為我們看到的物體上的皮膚。
結(jié)構(gòu)體:和C語(yǔ)言中的結(jié)構(gòu)體相同,用struct來(lái)定義結(jié)構(gòu)體,關(guān)于結(jié)構(gòu)體參考C語(yǔ)言中的結(jié)構(gòu)體。
數(shù)組:數(shù)組知識(shí)也和C中相同,不同的是數(shù)組聲明時(shí)可以不指定大小,但是建議在不必要的情況下,還是指定大小的好。
空類型:空類型用void表示,僅用來(lái)聲明不返回任何值得函數(shù)。
變量聲明示例:
float a=1.0; //申明float類型
int b=1; //聲明int類型
bool c=true; //聲明boolean類型
vec2 d=vec2(1.0,2.0); //聲明向量類型
vec3 e=vec3(1.0,2.0,3.0) //聲明向量類型
vec4 f=vec4(vec3,1.2);//聲明向量類型
vec4 g=vec4(0.2); //相當(dāng)于vec(0.2,0.2,0.2,0.2)
vec4 h=vec4(a,a,1.3,a);//聲明向量類型
mat2 i=mat2(0.1,0.5,1.2,2.4); //聲明矩陣類型
mat2 j=mat2(0.8); //相當(dāng)于mat2(0.8,0.8,0.8,0.8)
mat3 k=mat3(e,e,1.2,1.6,1.8);//聲明矩陣類型
三、運(yùn)算符
GLSL中的運(yùn)算符有(越靠前,運(yùn)算優(yōu)先級(jí)越高):
- 索引:[]
- 前綴自加和自減:++,–
- 一元非和邏輯非:~,!
- 加法和減法:+,-
- 等于和不等于:==,!=
- 邏輯異或:^^
- 三元運(yùn)算符號(hào),選擇:?:
- 成員選擇與混合:.
- 后綴自加和自減:++,–
- 乘法和除法:*,/
- 關(guān)系運(yùn)算符:>,<,=,>=,<=,<>
- 邏輯與:&&
- 邏輯或:||
- 賦值預(yù)算:=,+=,-=,*=,/=
四、限定符
名稱 介紹
attritude 一般用于各個(gè)頂點(diǎn)各不相同的量。如頂點(diǎn)顏色、坐標(biāo)等。
uniform 一般用于對(duì)于3D物體中所有頂點(diǎn)都相同的量。比如光源位置,統(tǒng)一變換矩陣等。
varying 表示易變量,一般用于頂點(diǎn)著色器傳遞到片元著色器的量。
const 常量
五、流程控制
GLSL中的流程控制與C中基本相同,主要有:
?if(){}、if(){}else{}、if(){}else if(){}else{}
?while(){}和do{}while()
?for(;;){}
?break和continue
六、函數(shù)
1.常見(jiàn)函數(shù)
radians(x):角度轉(zhuǎn)弧度
degrees(x):弧度轉(zhuǎn)角度
sin(x):正弦函數(shù),傳入值為弧度。相同的還有cos余弦函數(shù)、tan正切函數(shù)、asin反正弦、acos反余弦、atan反正切
pow(x,y):xyxy
exp(x):exex
exp2(x):2x2x
log(x):logexlogex
log2(x):log2xlog2x
sqrt(x):x√x
inversesqr(x):1x√1x
abs(x):取x的絕對(duì)值
sign(x):x>0返回1.0,x<0返回-1.0,否則返回0.0
ceil(x):返回大于或者等于x的整數(shù)
floor(x):返回小于或者等于x的整數(shù)
fract(x):返回x-floor(x)的值
mod(x,y):取模(求余)
min(x,y):獲取xy中小的那個(gè)
max(x,y):獲取xy中大的那個(gè)
mix(x,y,a):返回x?(1?a)+y?ax?(1?a)+y?a
step(x,a):x< a返回0.0,否則返回1.0
smoothstep(x,y,a):a < x返回0.0,a>y返回1.0,否則返回0.0-1.0之間平滑的Hermite插值。
dFdx(p):p在x方向上的偏導(dǎo)數(shù)
dFdy(p):p在y方向上的偏導(dǎo)數(shù)
fwidth(p):p在x和y方向上的偏導(dǎo)數(shù)的絕對(duì)值之和
2.幾何函數(shù)
length(x):計(jì)算向量x的長(zhǎng)度
distance(x,y):返回向量xy之間的距離
dot(x,y):返回向量xy的點(diǎn)積
cross(x,y):返回向量xy的差積
normalize(x):返回與x向量方向相同,長(zhǎng)度為1的向量
3.矩陣函數(shù)
matrixCompMult(x,y):將矩陣相乘
lessThan(x,y):返回向量xy的各個(gè)分量執(zhí)行x< y的結(jié)果,類似的有g(shù)reaterThan,equal,notEqual
lessThanEqual(x,y):返回向量xy的各個(gè)分量執(zhí)行x<= y的結(jié)果,類似的有類似的有g(shù)reaterThanEqual
any(bvec x):x有一個(gè)元素為true,則為true
all(bvec x):x所有元素為true,則返回true,否則返回false
not(bvec x):x所有分量執(zhí)行邏輯非運(yùn)算
4.紋理采樣函數(shù)
紋理采樣函數(shù)有texture2D、texture2DProj、texture2DLod、texture2DProjLod、textureCube、textureCubeLod及texture3D、texture3DProj、texture3DLod、texture3DProjLod等。
texture表示紋理采樣,2D表示對(duì)2D紋理采樣,3D表示對(duì)3D紋理采樣
Lod后綴,只適用于頂點(diǎn)著色器采樣
Proj表示紋理坐標(biāo)st會(huì)除以q
七、總結(jié)
其實(shí)GLSL這塊沒(méi)這么簡(jiǎn)單,他也是基于c的高級(jí)語(yǔ)言,所以這里就大致的記錄下,有興趣還需要好好的研究這門語(yǔ)言。比如一些美顏的效果需要借助這門語(yǔ)言+算法+圖像知識(shí)。