使用存儲着色器,咱們就必須認識一個工具類GLTools
。這是一個C++的工具類,其中有一個GLShaderManager
去管理全部的存儲着色器,他們可以知足進行一般渲染的基本要求。 GLShaderManager
在使用以前必須進行初始化:編程
shaderManager.InitializeStockShaders();
複製代碼
OpenGL支持多達16種能夠爲每一個頂點設置的不一樣類型參數。這些參數編號從0-15,而且能夠與頂點着色器中的任何制定變量相關聯,存儲着色器爲每一個變量都使用一致的內部變量命名規則和相同的屬性值。裏面列出了這些屬性:bash
標識符 | 描述 |
---|---|
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
值。GLShaderManager
類就能夠爲咱們完成這個操做。UseStockShader
函數會選擇一個存儲着色器並提供這個着色器的Uniform
值,這些工做經過一次函數調用就能完成:架構
GLShaderManager::UseStockShader(GLenum shader, ... ...);
複製代碼
這個函數根據咱們選擇的着色器從堆棧中提取正確的參數,這些參數就是特定着色器要求的Uniform值。框架
單元着色器只是簡單的使用默認的笛卡爾座標系。全部片斷都是用的同一種顏色,幾何圖形爲實心和未渲染的。這種着色器只使用一個屬性GLT_ATTIBUTE_VERTEX
。vColor
參數包含了要求的顏色。函數
//參數一:着色器屬性
//參數二:須要的顏色
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
複製代碼
平面着色器將統一着色器進行了擴展,容許爲幾何圖形變換指定一個4 * 4變換矩陣。典型狀況下這是一種左乘模型視圖矩陣和投影矩陣,也就是咱們常說的「模型視圖投影矩陣」。這種着色器只是用一個屬性GLT_ATTIBUTE_VERTEX
。工具
//參數一:着色器屬性
//參數二:容許變化的4*4矩陣
//參數三:顏色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16], GLfloat vColor[4]);
複製代碼
這種着色器惟一的Uniform值就是在幾何圖形中應用的變換矩陣。GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_COLOR
在這種着色器中都會使用。顏色值將被平滑得插入頂點之間(這就是所謂的平滑着色)。ui
//參數一:着色器屬性
//參數二:容許變化的4*4矩陣
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
複製代碼
這種着色器通俗點講,就是從觀察者的方向發出一個平行光所產生的效果。會使對象產生陰影和光照的效果。這裏須要模型視圖矩陣、投影矩陣和做爲基本色的顏色值等Uniform值。所需的屬性有GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_NORMAL
。spa
//參數一:着色器屬性
//參數二:模型視圖矩陣
//參數三:投影矩陣
//參數四:顏色值
GLShaderManager::UseStockShader(GLT_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);
複製代碼
這個着色器跟默認光源着色器比較像,可是點光源着色器的光源位置是特定的。這種着色器接受4個Uniform值,即模型視圖矩陣、投影矩陣、視圖座標系中的光源位置和對象的基本漫反射顏色。所需的屬性有GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_NORMAL
。code
//參數一:着色器屬性
//參數二:模型視圖矩陣
//參數三:投影矩陣
//參數四:視點座標光源位置
//參數五:顏色值
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);
複製代碼
着色器經過給定的模型視圖投影矩陣,使用綁定到nTextureUnit指定的紋理單元的紋理對幾何圖形進行變換。片斷顏色是直接從紋理樣本中直接獲取的。所需的屬性有GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_NORMAL
。orm
//參數一:着色器屬性
//參數二:投影矩陣
//參數三:須要相乘的紋理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
複製代碼
這種着色器將一個基本色乘以一個取自紋理單元的TextureUnit的紋理。所需的屬性有GLT_ATTIBUTE_VERTEX
和GLT_ATTIBUTE_TEXTURE0
。
//參數一:着色器屬性
//參數二:投影矩陣
//參數三:顏色
//參數四:須要相乘的紋理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);
複製代碼
這種着色器將一個紋理經過漫反射照明計算進行調整(相乘),光線在視覺空間中的位置是給定的。這種着色器接受5個Uniform值,即模型視圖矩陣、投影矩陣、視覺空間中的光源位置、幾何圖形的基本色和將要使用的紋理單元。所需的屬性有GLT_ATTIBUTE_VERTEX
、GLT_ATTIBUTE_TEXTURE0
和GLT_ATTIBUTE_NORMAL
。
//參數一:着色器屬性
//參數二:投影矩陣
//參數三:視圖空間中的光源位置
//參數四:幾何圖形的基本色
//參數五:將要使用的紋理單元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DEFF, GLfloat mvMatrix, GLfloat mvpMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4], GLint nTextureUnit);
複製代碼