iOS OpenGL開發(fā)(四) - 存儲著色器分類

OpenGL

#****前言

在OpenGL核心框架中檬果,是沒有提供任何內(nèi)建渲染管線的,在提交一個集合圖形進行渲染之前贾节,必須制定一個著色器汁汗。在OpenGL渲染架構解析這篇文章中我們了解到了兩個很重要的著色器:********頂點著色器********和********片元著色器********衷畦。這兩個著色器屬于可編程管線范疇栗涂。那么對于固定管線中,我們還有哪一些著色器可以使用呢祈争?接下來斤程,這一片文章,就帶領大家了解一下菩混,存儲著色器中的八大著色器忿墅。

## 使用存儲著色器

使用存儲著色器,我們就必須認識一個工具類GLTools沮峡。這是一個C++的工具類疚脐,其中有一個GLShaderManager去管理所有的存儲著色器,他們能夠滿足進行通常渲染的基本要求邢疙。

GLShaderManager在使用之前必須進行初始化:


shaderManager.InitializeStockShaders();

## 屬性

OpenGL支持多達16種可以為每個頂點設置的不同類型參數(shù)棍弄。這些參數(shù)編號從0-15望薄,并且可以與頂點著色器中的任何制定變量相關聯(lián),存儲著色器為每個變量都使用一致的內(nèi)部變量命名規(guī)則和相同的屬性值呼畸。里面列出了這些屬性:

標識符 | 描述

-------|------

GLT _ ATTIBUTE _ VERTEX | 3分量(x, y , z)頂點位置

GLT _ ATTIBUTE _ COLOR | 4分量(r, g, b, a)顏色值

GLT _ ATTIBUTE _ NORMAL | 3分量(x, y , z)表面法線

GLT _ ATTIBUTE _ TEXTURE0 | 第一對2分量(s, t)紋理坐標

GLT _ ATTIBUTE _ TEXTURE1 | 第二對2分量(s, t)紋理坐標

## Uniform****值

這個值我想大家應該不會陌生痕支,上一篇文章中我們有提到這個參數(shù)。其實要對幾何圖形進行渲染蛮原,我們需要為對象遞交屬性矩陣卧须,但首先要綁定到我們想要使用的著色器程序上,并提供程序的Uniform值儒陨。GLShaderManager類就可以為我們完成這個操作花嘶。UseStockShader函數(shù)會選擇一個存儲著色器并提供這個著色器的Uniform值顽照,這些工作通過一次函數(shù)調(diào)用就能完成:


GLShaderManager::UseStockShader(GLenum shader, ... ...);

這個函數(shù)根據(jù)我們選擇的著色器從堆棧中提取正確的參數(shù)基显,這些參數(shù)就是特定著色器要求的Uniform值。

## 存儲著色器分類

### 1****术辐、單位(****Identity****)著色器****/****單元著色器

單元著色器只是簡單的使用默認的********笛卡爾坐標系********津辩。所有片段都是用的同一種顏色拆撼,幾何圖形為實心和未渲染的。這種著色器只使用一個屬性GLT_ATTIBUTE_VERTEX喘沿。vColor參數(shù)包含了要求的顏色闸度。


//參數(shù)一:著色器屬性 

//參數(shù)二:需要的顏色

GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);

### 2****、平面著色器

平面著色器將統(tǒng)一著色器進行了擴展蚜印,允許為幾何圖形變換指定一個4 * 4變換矩陣莺禁。典型情況下這是一種左乘模型視圖矩陣和投影矩陣,也就是我們常說的“********模型視圖投影矩陣********”窄赋。這種著色器只是用一個屬性GLT_ATTIBUTE_VERTEX哟冬。


//參數(shù)一:著色器屬性 

//參數(shù)二:允許變化的4*4矩陣

//參數(shù)三:顏色

GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16], GLfloat vColor[4]);

### 3****、上色(****Shaded****)著色器

這種著色器唯一的Uniform值就是在幾何圖形中應用的變換矩陣忆绰。GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_COLOR在這種著色器中都會使用浩峡。顏色值將被平滑得插入頂點之間(這就是所謂的********平滑著色********)。


//參數(shù)一:著色器屬性 

//參數(shù)二:允許變化的4*4矩陣

GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);

### 4****错敢、默認光源著色器

這種著色器通俗點講翰灾,就是從觀察者的方向發(fā)出一個平行光所產(chǎn)生的效果。會使對象產(chǎn)生陰影和光照的效果稚茅。這里需要********模型視圖矩陣********纸淮、********投影矩陣********和作為基本色的顏色值等Uniform值。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL亚享。


//參數(shù)一:著色器屬性 

//參數(shù)二:模型視圖矩陣

//參數(shù)三:投影矩陣

//參數(shù)四:顏色值

GLShaderManager::UseStockShader(GLT_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);

### 5****咽块、點光源著色器

這個著色器跟默認光源著色器比較像,但是點光源著色器的光源位置是特定的欺税。這種著色器接受4個Uniform值侈沪,即********模型視圖矩陣********飒货、********投影矩陣********、視圖坐標系中的光源位置和對象的基本漫反射顏色峭竣。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL塘辅。


//參數(shù)一:著色器屬性 

//參數(shù)二:模型視圖矩陣

//參數(shù)三:投影矩陣

//參數(shù)四:視點坐標光源位置

//參數(shù)五:顏色值

GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);

### 6****、紋理替換矩陣

著色器通過給定的模型視圖投影矩陣皆撩,使用綁定到nTextureUnit指定的紋理單元的紋理對幾何圖形進行變換扣墩。片段顏色是直接從紋理樣本中直接獲取的。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL扛吞。


//參數(shù)一:著色器屬性 

//參數(shù)二:投影矩陣

//參數(shù)三:需要相乘的紋理

GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);

### 7****呻惕、紋理調(diào)整著色器

這種著色器將一個基本色乘以一個取自紋理單元的TextureUnit的紋理。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_TEXTURE0滥比。


//參數(shù)一:著色器屬性 

//參數(shù)二:投影矩陣

//參數(shù)三:顏色

//參數(shù)四:需要相乘的紋理

GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);

### 8****亚脆、紋理光源著色器

這種著色器將一個紋理通過漫反射照明計算進行調(diào)整(相乘),光線在視覺空間中的位置是給定的盲泛。這種著色器接受5個Uniform值濒持,即********模型視圖矩陣********、********投影矩陣********寺滚、視覺空間中的光源位置柑营、幾何圖形的基本色和將要使用的紋理單元。所需的屬性有GLT_ATTIBUTE_VERTEX村视、GLT_ATTIBUTE_TEXTURE0GLT_ATTIBUTE_NORMAL官套。


//參數(shù)一:著色器屬性 

//參數(shù)二:投影矩陣

//參數(shù)三:視圖空間中的光源位置

//參數(shù)四:幾何圖形的基本色

//參數(shù)五:將要使用的紋理單元

GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DEFF, GLfloat mvMatrix, GLfloat mvpMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4], GLint nTextureUnit);

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚁孔,隨后出現(xiàn)的幾起案子奶赔,更是在濱河造成了極大的恐慌,老刑警劉巖杠氢,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件站刑,死亡現(xiàn)場離奇詭異,居然都是意外死亡修然,警方通過查閱死者的電腦和手機笛钝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愕宋,“玉大人,你說我怎么就攤上這事结榄≈斜矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵臼朗,是天一觀的道長邻寿。 經(jīng)常有香客問我蝎土,道長,這世上最難降的妖魔是什么绣否? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任誊涯,我火速辦了婚禮,結果婚禮上蒜撮,老公的妹妹穿的比我還像新娘暴构。我一直安慰自己,他們只是感情好段磨,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布取逾。 她就那樣靜靜地躺著,像睡著了一般苹支。 火紅的嫁衣襯著肌膚如雪砾隅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天债蜜,我揣著相機與錄音晴埂,去河邊找鬼。 笑死寻定,一個胖子當著我的面吹牛邑时,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播特姐,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼晶丘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了唐含?” 一聲冷哼從身側響起浅浮,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捷枯,沒想到半個月后滚秩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡淮捆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年郁油,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攀痊。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡桐腌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苟径,到底是詐尸還是另有隱情案站,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布棘街,位于F島的核電站蟆盐,受9級特大地震影響承边,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜石挂,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一博助、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痹愚,春花似錦富岳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疾瓮,卻和暖如春脖镀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狼电。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工蜒灰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肩碟。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓强窖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親削祈。 傳聞我的和親對象是個殘疾皇子翅溺,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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