OpenGL(四)-固定管線著色器/存儲著色器

logo.jpg

在早期的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)整(相乘).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容