OpenGL ES 入門 — 2.GLSL基礎

在OpenGL 3.0之前漓拾,OpenGL 使用的是固定渲染管線乌企,使用存儲著色器完成渲染虑润,存儲著色器就是寫好了著色程序,直接修改參數(shù)加酵,調(diào)用API就可以滿足渲染拳喻,而3.1版本以后哭当,我們可以通過 GLSL(OpenGL Shading Langruage)自定義著色程序(主要是頂點著色器和片元著色器程序)來完成渲染。

在OpenGL ES中冗澈,我們就是通過使用GLSL來自己編寫著色器的钦勘,所以接下來介紹下GLSL基礎知識。

簡介

GLSL作為一種著色器編寫語言是純粹和GPU打交道的計算機語言渗柿。

渲染結(jié)構(gòu)

圖中Client通過三種方式向server發(fā)送數(shù)據(jù)

  1. Attributes个盆,屬性以向量傳遞數(shù)據(jù),屬性只有向頂點著色器傳遞才有意義朵栖。
  2. Uniforms,Uniforms可以在頂點著色器和片元著色器使用柴梆,Uniforms只能使用不可以修改陨溅。
  3. Texture Data,可以在頂點著色器和片元著色器使用绍在。

最常見用法是在頂點著色器里生成所需要的值门扇,然后傳給片元著色器用。

需要注意的是:

  1. GLSL支持函數(shù)重載偿渡。
  2. GLSL不能自動提升數(shù)據(jù)類型臼寄,所以類型必須嚴格保持一致。
float f = 2.3; 
bool b = bool(f); // b is true
  1. GLSL沒有指針溜宽,字符串吉拳,字符,它基本上是一種處理數(shù)字數(shù)據(jù)的語言适揉。
  2. GLSL不支持聯(lián)合留攒、枚舉類型、結(jié)構(gòu)體位字段及按位運算符嫉嘀。

數(shù)據(jù)類型

  1. 標量

GLSL有三種標量基本數(shù)據(jù)類型:float炼邀,int和bool。

  1. 向量數(shù)據(jù)類型
向量數(shù)據(jù)類型
vec3 v; //聲明三維浮點型向量v  
v[1]=3.0; //給向量v的第二個元素賦值  

// 下面兩種等價
vec3 v = vec3(0.6);
vec3 v = vec3(0.6, 0.6, 0.6);

另外剪侮,可以用選擇運算符的方式來使用向量拭宁。選擇運算符是對于向量的各個元素(最多為4個)約定俗成的名稱,用一個小寫拉丁字母來表示:

  • 頂點 (x瓣俯、y杰标、z、w)
  • 顏色 (r降铸、g在旱、b、a)
  • 紋理 (s推掸、t桶蝎、r驻仅、q)
vec4 v1=vec4(1.0, 2.0, 3.0, 4.0); //四維浮點型向量
vec4 v2;  
v2.xy=v1.yz; //將v1的第二個和第三個元素復制到v2的第一個和第二個元素 
v2.z=2.0; //給v2的第三個元素賦值  
v2.xy=v1.yx; //將v1的頭兩個元素互換登渣,再復制到v2的頭兩個元素中
  1. 矩陣數(shù)據(jù)類型
矩陣數(shù)據(jù)類型
mat4 m;  //聲明四維浮點型方陣m  
m[2][3]=2.0; //給方陣的第三列噪服、第四行元素賦值 

// 下面兩種等價,初始化矩陣對角
mat2 m = mat2(1.0)
mat2 m = mat2(1.0, 0.0, 0.0, 1.0);
  1. 取樣器(Sampler)

sampler1D 訪問一個一維紋理
sampler2D 訪問一個二維紋理
sampler3D 訪問一個三維紋理
samplerCube 訪問一個立方貼圖紋理
sampler1DShadow 訪問一個帶對比的一維深度紋理
sampler2DShadow 訪問一個帶對比的二維深度紋理

uniform sampler2D grass;
vcc2 coord = vec2(100, 100);
vec4 color = texture2D(grass, coord);

如果一個著色器要在程序里結(jié)合多個紋理胜茧,可以使用取樣器數(shù)組:

const int tex_nums = 4;
uniform sampler2D textures[tex_nums];

for(int i = 0; i < tex_nums; ++i) {
    sampler2D tex = textures[i];
    // todo ...
}
  1. 結(jié)構(gòu)體
struct light  
{  
    vec3 position;  
    vec3 color;  
};  
light ceiling_light;
  1. 數(shù)組

數(shù)組索引是從0開始的粘优,而且沒有指針概念

// 創(chuàng)建一個10個元素的數(shù)組  
vec4 points[10];  

// 創(chuàng)建一個不指定大小的數(shù)組
vec4 points[]; 
points[2] = vec4(1.0);  // points現(xiàn)在大小為3
points[7] = vec4(2.0);  // points現(xiàn)在大小為8
void

限定符

限定符

常用的限定符有:

  • const,和C++里差不多呻顽,定義不可變常量雹顺,表示限定的變量在編譯時不可被修 改。

  • attribute廊遍,該限定符標記的是一種全局變量,該變量在頂點著色器中是只讀(read-only)的嬉愧,該變量被用作從OpenGL應用程序向頂點著色器中傳遞參數(shù),因此該限定符僅能用于頂點著色器喉前,例如頂點坐標没酣、顏色,法線卵迂,紋理坐標裕便。

attribute vec4 position;
attribute vec2 textureCoord0;//紋理坐標
  • uniform,一般是外部應用程序傳給頂點著色器和片斷著色器见咒,也是一種全局變量,該變量對于一個圖元(primitive)來說是不可更改的偿衰,它可以從OpenGL應用程序中接收傳遞來的參數(shù),例如:
uniform mat4 viewProjectMatix;
uniform mat4 viewMatix;
uniform vec3 lightPosition;
  • varying论颅,用于傳遞頂點著色器的值給片元著色器哎垦,它提供了從頂點著色器向片元著色器傳遞數(shù)據(jù)的方法,varying限定符可以在頂點著色器中定義變量恃疯,然后再傳遞給光柵化器漏设,光柵化器對數(shù)據(jù)插值后,再將每個片段的值交給片元著色器今妄,注意在頂點著色器定義的變量名要跟片元著色器中接收的變量名一樣郑口。
varying vec2 textureCoord0;
著色器渲染過程

混合操作

通過在選擇器(.)后列出各分量名,就可以選擇這些分量

vec4 v4;
v4.rgba;    // 得到vec4
v4.rgb;     // 得到vec3
v4.b;       // 得到float
v4.xy;      // 得到vec2
v4.xgba;    // 錯誤盾鳞!分量名不是同一類

v4.wxyz;    // 打亂原有分量順序
v4.xxyy;    // 重復分量
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犬性,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腾仅,更是在濱河造成了極大的恐慌乒裆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件推励,死亡現(xiàn)場離奇詭異鹤耍,居然都是意外死亡肉迫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門稿黄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喊衫,“玉大人,你說我怎么就攤上這事杆怕∽骞海” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵陵珍,是天一觀的道長寝杖。 經(jīng)常有香客問我,道長撑教,這世上最難降的妖魔是什么朝墩? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮伟姐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亿卤。我一直安慰自己愤兵,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布排吴。 她就那樣靜靜地躺著秆乳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钻哩。 梳的紋絲不亂的頭發(fā)上屹堰,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音街氢,去河邊找鬼扯键。 笑死,一個胖子當著我的面吹牛珊肃,可吹牛的內(nèi)容都是我干的荣刑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼伦乔,長吁一口氣:“原來是場噩夢啊……” “哼厉亏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烈和,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤爱只,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后招刹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恬试,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡窝趣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忘渔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片高帖。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尤泽,到底是詐尸還是另有隱情内贮,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布预麸,位于F島的核電站,受9級特大地震影響儒将,放射性物質(zhì)發(fā)生泄漏吏祸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一钩蚊、第九天 我趴在偏房一處隱蔽的房頂上張望贡翘。 院中可真熱鬧,春花似錦砰逻、人聲如沸鸣驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踊东。三九已至,卻和暖如春刚操,著一層夾襖步出監(jiān)牢的瞬間闸翅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工菊霜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坚冀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓占卧,卻偏偏與公主長得像遗菠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子华蜒,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355