在說儲存著色器的種類之前,我們先來大致看一下OpenGL的基本渲染架構,這樣有助於我們對整個渲染流程的理解。
OpenGL的渲染架構
在上一篇名稱解釋中我們說到在OpenGL下渲染圖形,就會經歷一個個節點.而這樣的操作可以理解為管線.下面我們用一張簡易架構圖看看OpenGL圖形渲染在這個所謂的管線中到底是怎麼經歷一個個節點的。
圖: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: 紋理理單元