在說存儲着色器的種類以前,咱們先來大體看一下OpenGL的基本渲染架構,這樣有助於咱們對整個渲染流程的理解。開發
在上一篇名稱解釋中咱們說到在OpenGL下渲染圖形,就會經歷一個個節點.而這樣的操做能夠理解爲管線.下面咱們用一張簡易架構圖看看OpenGL圖形渲染在這個所謂的管線中究竟是怎麼經歷一個個節點的。get
圖:OpenGL 渲染架構圖)
從上圖中咱們能夠看出整個管線分爲2個部分,客戶端(Client)和服務端(Server)。
客戶端就是咱們編寫的程序代碼以及OpenGL API,這部分代碼運行在CPU上。
服務端是寫在設備底層硬件裏面的,是真正完成渲染操做的 ,它運行在GPU上,從圖中能夠看出,服務端主要包括頂點着色器(Vertex Shader)和 片元着色器(Fragment Shader)。首先由頂點着⾊器對傳⼊的頂點數據進⾏運算。再經過圖元裝配,將頂點轉換爲圖元。而後進⾏光柵化,將圖元這種⽮量圖形,轉換爲柵格化數據。最後,將柵格化數據傳入⽚元着⾊器中進⾏運算。⽚元着⾊器會對柵格化數據中的每⼀個像素進⾏運算,並決定像素的顏⾊和深度值。
客戶端不斷的把數據塊和命令塊組合在一塊兒輸送到緩衝區,而後緩衝區就會發送到服務器執行,若是服務器中止工做等待客戶端,或者客戶端中止工做來等待服務器作好接受更多的命令和數據的準備,咱們把這種狀況陳爲管線停滯
客戶端和服務端的通訊只能只能經過Attributes屬性,Uniforms和Texture Data 紋理數據這三種數據類型。並且值得注意的是Attributes 屬性只能傳給Vertex Shader 頂點着色。
固定存儲着色器就是早期的OpenGL版本封裝的幫助開發者完成圖形渲染的程序塊,咱們經常使用的有一下幾種:
使用場景:繪製默認OpenGL 座標系(-1,1)下圖形. 圖形全部片斷都會以⼀種顏色填充。
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY,GLFloat vColor[4])
參數1: 存儲着⾊器種類-單元着⾊器; 參數2: 顏⾊
使用場景:在繪製圖形時, 能夠應⽤變換(模型/投影變換).
GLShaderManager::UseStockShader(GLT_SHADER_FLAT,GLFloat mvp[16],GLFloat vColor[4])
參數1: 存儲着⾊器種類-平面着⾊器;參數2:容許變化的4*4矩陣;參數3: 顏⾊
使⽤用場景: 在繪製圖形時, 能夠應用變換(模型/投影變換) ,顏⾊將會平滑地插入到頂點之間 稱爲平滑着色.
GLShaderManager::UseStockShader(GLT_SHADER_SHADER,mvp[16])
使用場景:在繪製圖形時, 能夠應用變換(模型/投影變換),而且這種着⾊器會使繪製的圖形產⽣陰影和光照的效果.
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT,GLFloat mvMatrix[16], GLFloat pMatrix[16], GLFloat vColor[4])
參數1: 存儲着⾊器種類-默認光源着⾊器 ;參數2: 模型視圖4*4矩陣;參數3: 投影4*4矩陣;參數4: 顏⾊值
使⽤場景: 在繪製圖形時, 能夠應⽤變換(模型/投影變換) ,而且這種着⾊器會使繪製的圖形產⽣陰影和光照的效果.它與默認光源着⾊器⾮常相似,區別只是光源位置多是特定的.
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLFloat mvMatrix[16], GLFloat pMatrix[16],GLFloat vLightPos[3], GLFloat vColor[4])
參數1: 存儲着⾊器種類-點光源着⾊器 ;參數2: 模型視圖4*4矩陣;參數3: 投影4*4矩陣;參數4:點光源位置;參數5: 顏⾊值
使⽤場景: 在繪製圖形時, 能夠應用變換(模型/投影變換),這種着⾊器經過給定的模型視圖投影矩陣.使用紋理單元來進⾏顏⾊填充.其中每一個像素點的顏⾊都是從紋理中獲取.
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE,GLFloat mvMatrix[16],GLint nTextureUnit)
參數1: 存儲着⾊器種類-紋理替換矩陣着色器 ;參數2: 模型視圖4*4矩陣;參數3:紋理單元;
使⽤場景: 在繪製圖形時, 能夠應用變換(模型/投影變換),這種着⾊器經過給定的模型視圖矩陣. 着⾊器將一個基本色乘以一個取自紋理單元nTextureUnit 的紋理.將顏色與紋理進行顏色混合後才填充到片斷中.
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
參數1: 存儲着⾊器種類-紋理調整着色器;參數2: 模型視圖4*4矩陣;參數3:顏色;參數4:紋理單元;
使⽤場景: 在繪製圖形時, 能夠應⽤變換(模型/投影變換)。這種着色器經過給定的模型視圖投影矩陣. 着⾊器將⼀個紋理經過漫反射照明計算進⾏調整(相乘).
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
參數1: 存儲着色器種類-紋理光源着色器;參數2: 模型視圖4*4矩陣;參數3: 投影4*4矩陣;參數4: 點光源位置;參數5: 顏⾊值(⼏何圖形的基本色) ;參數6: 紋理理單元