#****前言
在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_VERTEX
和GLT_ATTIBUTE_COLOR
在這種著色器中都會使用浩峡。顏色值將被平滑得插入頂點之間(這就是所謂的********平滑著色********)。
//參數(shù)一:著色器屬性
//參數(shù)二:允許變化的4*4矩陣
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
### 4****错敢、默認光源著色器
這種著色器通俗點講翰灾,就是從觀察者的方向發(fā)出一個平行光所產(chǎn)生的效果。會使對象產(chǎn)生陰影和光照的效果稚茅。這里需要********模型視圖矩陣********纸淮、********投影矩陣********和作為基本色的顏色值等Uniform值。所需的屬性有GLT_ATTIBUTE_VERTEX
和GLT_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_VERTEX
和GLT_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_VERTEX
和GLT_ATTIBUTE_NORMAL
扛吞。
//參數(shù)一:著色器屬性
//參數(shù)二:投影矩陣
//參數(shù)三:需要相乘的紋理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
### 7****呻惕、紋理調(diào)整著色器
這種著色器將一個基本色乘以一個取自紋理單元的TextureUnit的紋理。所需的屬性有GLT_ATTIBUTE_VERTEX
和GLT_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_TEXTURE0
和GLT_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);