原文:https://blog.csdn.net/uyy203/article/details/79757333
OpenGL 著色器中使用的是著色語言GLSL盈咳。著色語言源自C語言辕宏,提供了豐富的原生類型腊瑟,如向量、矩陣等菜秦,還有大量的內(nèi)建函數(shù)主慰,這在處理3D圖形時可以更加高效嚣州、易用。下面是整理的是OpenGL ES2.0的GLSL語言河哑。
基本數(shù)據(jù)類型
標(biāo)量
GLSL中的標(biāo)量含布爾避诽、int和float,聲明方法也跟一般的語言相似:
向量
由2璃谨,3或4維標(biāo)量組成:
訪問向量的某個分量可以通過數(shù)組下標(biāo)v[0]訪問沙庐,起始索引為0。也可以通過.+分量名來訪問佳吞,根據(jù)目的GLSL中有三套分量名拱雏,分別為顏色r,g,b,a,坐標(biāo)x,y,z,w和紋理坐標(biāo)s,t,p,q底扳,使用的時候三套分量名是相同作用的铸抑,只要同時使用時,保證為同一套即可:
矩陣
在3D場景中衷模,矩陣是十分重要的鹊汛,平移,旋轉(zhuǎn)或者縮放都是靠矩陣運行實現(xiàn)的阱冶。所以GLSL中原生支持矩陣類型和相應(yīng)的矩陣計算刁憋。
矩陣可以看成由多個列向量組成,類似于二維數(shù)組木蹬,通過m[0]訪問第一列向量至耻,通過m[0][0]訪問第一行第一列的值。
采樣器
一種特殊的基本數(shù)據(jù)類型,專門用來進行紋理采樣的相關(guān)操作尘颓,我的理解采樣器就是是一幅或一套紋理的引用走触,其值由宿主程序傳入(Android即為Java):
結(jié)構(gòu)體
類似于C語言中的結(jié)構(gòu)體,聲明方式同樣使用struct關(guān)鍵字:
數(shù)組
跟C語言不太一樣的是疤苹,數(shù)組聲明的時候可以不指定長度互广,使用數(shù)組時也不用關(guān)心越界問題,編譯器會自動創(chuàng)建適當(dāng)大小的數(shù)組:
空類型
使用void表示痰催,用來聲明不含返回值的函數(shù)兜辞,main函數(shù)就是例子。
基本語法
大部分語法都是跟C語言類似的夸溶,像變量聲明逸吵、初始化,變量的作用域缝裁,運算符扫皱,if/else、for捷绑、while流程控制等都幾乎是一樣的韩脑,主要提一下不一樣的地方。
1粹污、系統(tǒng)許多的內(nèi)建變量都是以_gl為開頭的段多,所以用戶自定義的變量不要使用這個做開頭。
2壮吩、向量进苍、矩陣初始化時各個元素既可以是字面常量也可以是變量:
3、通過.可以混合選擇向量的分量鸭叙,并且可以重新排列:
4觉啊、GLSL中對類型的匹配十分嚴格,沒有類型自動轉(zhuǎn)換的功能沈贝,左值右值的類型必須完全相同杠人,類型的強制轉(zhuǎn)換需要通過類似于構(gòu)造函數(shù)的方式:
5、函數(shù)參數(shù)的修飾符:缺省為in修飾符宋下,修飾輸入?yún)?shù)嗡善,相當(dāng)于在函數(shù)體中使用的是參數(shù)的拷貝,跟一般的函數(shù)參數(shù)一樣学歧;out修飾符罩引,修飾輸出參數(shù),類似于傳入了指針或引用撩满,在函數(shù)體給變量賦值會改變該變量的值,不能是字面常量;inout具有輸入輸出兩種功能伺帘。
6昭躺、指定變量的精度:通過lowp、mediump和highp作為限定符修飾變量就可以指定變量的精度伪嫁。同一個著色器中所有相關(guān)類型都用一個精度可以在著色器第一句使用precision
限定符
要想正確使用GLSL领炫,限定符的意義和所修飾的變量如何使用是很重要的:
內(nèi)建變量
不需要聲明即可直接使用,分為輸出變量和輸入變量张咳,輸出變量可以在著色器賦值帝洪,進而傳入到渲染管線中,輸入變量為只讀變量脚猾,常用的內(nèi)建變量并不多:
內(nèi)置函數(shù)
GLSL內(nèi)置了大量內(nèi)置函數(shù)葱峡,通常都是以最優(yōu)方式實現(xiàn),有的甚至直接硬件支持龙助。包含大量數(shù)學(xué)函數(shù):三角函數(shù)砰奕、指數(shù)函數(shù)、幾何函數(shù)提鸟、向量矩陣函數(shù)等军援,這些可以自己開發(fā)編寫,但是往往效率低下称勋,使用內(nèi)置函數(shù)可以更高效更方便的做圖像處理胸哥。還有一些沒有辦法自己編寫的函數(shù),如紋理采樣函數(shù):
通過采樣器指定到一幅紋理赡鲜,在通過坐標(biāo)獲得某一位置的顏色值空厌,這個函數(shù)在需要進行紋理貼圖時會用到。
基本程序結(jié)構(gòu)
一套program含一個頂點著色器和一個片元著色器蝗蛙,最基礎(chǔ)的不含復(fù)雜圖形計算的著色器其實是很簡單的:
頂點著色器
片元著色器