
在早期的OpenGL版本,它封裝了很多種著色?程序塊內(nèi)置的一段包含了光 照、坐標(biāo)變換、裁剪等諸多功能的固定shader程序來完成,來幫助開發(fā)者來完成圖形的渲染. 而開發(fā)者只需要傳入相應(yīng)的參數(shù),就能快速完成圖形的渲染. 類似于iOS開發(fā)會封裝很多API,?我們只需要調(diào)用,就可以實(shí)現(xiàn)功能.不需要關(guān)注底層實(shí)現(xiàn)原理。
但是由于OpenGL的使?場景?常豐富,固定管線或存儲著?色??法完成每?個(gè)業(yè)務(wù).這時(shí)將相關(guān)部分開放成可編程。
使用固定管線著色器最方便之處就是你不需要考慮渲染到底是頂點(diǎn)著色器還是片元著色器.所以你在使用存儲著色器時(shí),不需要思考傳遞數(shù)據(jù)時(shí),該用哪種方式傳送.你只需要傳遞不同存儲器所需要的數(shù)據(jù)到參數(shù)列表就可以了. 至于它的底層是如何實(shí)現(xiàn)的,并不需要關(guān)心.因?yàn)檫@一切它已經(jīng)封裝起來了.
接下來我們介紹一下每個(gè)著色器的使用方法和使用場景。
固定管線著色器的實(shí)現(xiàn)需要調(diào)用GLShaderManager中的UseStockShader函數(shù)來完成。
使用前需要進(jìn)行初始化:
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders()
一.單元著色器
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
| 參數(shù) | 描述 |
|---|---|
| GLT_SHADER_IDENTITY | 存儲著色?種類-單元著色? |
| vColor[4] | 顏色 |
使?場景: 繪制默認(rèn)OpenGL坐標(biāo)系(-1,1)下圖形. 圖形所有?段都會以?種顏色填充
二.平面著色器
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
| 參數(shù) | 描述 |
|---|---|
| GLT_SHADER_FLAT | 存儲著色?種類-平面著色? |
| mvp[16] | 允許變化的4*4矩陣 |
| vColor[4] | 顏色 |
**使?場景: **在繪制圖形時(shí), 可以應(yīng)?變換(模型/投影變化).
三.上色著色器
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
| 參數(shù) | 描述 |
|---|---|
| GLT_SHADER_SHADED | 存儲著色?種類-上色著色器 |
| mvp[16] | 允許變化的4*4矩陣 |
使?場景: 在繪制圖形時(shí), 可以應(yīng)?變換(模型/投影變化)顏色將會平滑地插?到頂點(diǎn)之間稱為平滑著色.
四.默認(rèn)光源著色器
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
| 參數(shù) | 描述 |
|---|---|
| GLT_SHADER_DEFAULT_LIGHT | 存儲著色?種類-默認(rèn)光源著色器 |
| mvMatrix[16] | 模型4*4矩陣 |
| pMatrix[16] | 投影4*4矩陣 |
| vColor[4] | 顏色 |
**使?場景: **在繪制圖形時(shí), 可以應(yīng)用變換(模型/投影變化)這種著色?會使繪制的圖形產(chǎn)生陰影和光照的效果.
五.點(diǎn)光源著色器
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
| 參數(shù) | 描述 |
|---|---|
| GLT_SHADER_POINT_LIGHT_DIEF | 存儲著色?種類-點(diǎn)光源著色器 |
| mvMatrix[16] | 模型4*4矩陣 |
| pMatrix[16] | 投影4*4矩陣 |
| vLightPos[4] | 點(diǎn)光源的位置 |
| vColor[4] | 漫反射顏色值(光源顏色) |
使?場景: 在繪制圖形時(shí), 可以應(yīng)用變換(模型/投影變化)這種著色?會使繪制的圖形產(chǎn)?陰影和光照的效果.它與默認(rèn)光源著色器非常類似,區(qū)別只是光源位置可能是特定的.
六.紋理替換矩陣著色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
| 參數(shù) | 描述 |
|---|---|
| GLT_SHADER_TEXTURE_REPLACE | 存儲著色?種類-紋理替換矩陣著色器 |
| mvMatrix[16 | 模型4*4矩陣 |
| nTextureUnit | 紋理單元 |
使?場景: 在繪制圖形時(shí), 可以應(yīng)用變換(模型/投影變化)這種著色?通過給定的模型視圖投影矩陣.使?紋理單元來進(jìn)行顏色填充.其中每個(gè)像素點(diǎn)的顏?是從紋理中獲取.
七.紋理調(diào)整著色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
| 參數(shù) | 描述 |
|---|---|
| GLT_SHADER_TEXTURE_MODULATE | 存儲著色?種類-紋理替換矩陣著色器 |
| mvMatrix[16] | 模型4*4矩陣 |
| vColor[4] | 顏色 |
| nTextureUnit | 紋理單元 |
**使?場景: **在繪制圖形時(shí), 可以應(yīng)用變換(模型/投影變化)這種著色?通過給定的模型視圖投影矩陣. 著色?將一個(gè)基本?乘以一個(gè)取?紋理單元nTextureUnit的紋理.將顏色與紋理進(jìn)行顏?混合后才填充到?段中.
八.紋理光源著色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
| 參數(shù) | 描述 |
|---|---|
| GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF | 存儲著色?種類-紋理光源著色器 |
| mvMatrix[16] | 模型4*4矩陣 |
| pMatrix[16] | 投影4*4矩陣 |
| vLightPos[4] | 點(diǎn)光源的位置 |
| vBaseColor[4] | 顏色值(?何圖形的基本色) |
| nTextureUnit | 紋理單元 |
**使?場景: *在繪制圖形時(shí), 可以應(yīng)用變換(模型/投影變化)這種著色?通過給定的模型視圖投影矩陣. 著色?將?個(gè)紋理通過漫反射照明計(jì)算進(jìn)行調(diào)整(相乘).