iOS OpenGL開發(四) - 存儲着色器分類

OpenGL
#前言 在OpenGL核心框架中,是沒有提供任何內建渲染管線的,在提交一個集合圖形進行渲染以前,必須制定一個着色器。在 OpenGL渲染架構解析這篇文章中咱們瞭解到了兩個很重要的着色器: 頂點着色器片元着色器。這兩個着色器屬於可編程管線範疇。那麼對於固定管線中,咱們還有哪一些着色器可使用呢?接下來,這一片文章,就帶領你們瞭解一下,存儲着色器中的八大着色器。

使用存儲着色器

使用存儲着色器,咱們就必須認識一個工具類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值

這個值我想你們應該不會陌生,上一篇文章中咱們有提到這個參數。其實要對幾何圖形進行渲染,咱們須要爲對象遞交屬性矩陣,但首先要綁定到咱們想要使用的着色器程序上,並提供程序的Uniform值。GLShaderManager類就能夠爲咱們完成這個操做。UseStockShader函數會選擇一個存儲着色器並提供這個着色器的Uniform值,這些工做經過一次函數調用就能完成:架構

GLShaderManager::UseStockShader(GLenum shader, ... ...);
複製代碼

這個函數根據咱們選擇的着色器從堆棧中提取正確的參數,這些參數就是特定着色器要求的Uniform值。框架

存儲着色器分類

一、單位(Identity)着色器/單元着色器

單元着色器只是簡單的使用默認的笛卡爾座標系。全部片斷都是用的同一種顏色,幾何圖形爲實心和未渲染的。這種着色器只使用一個屬性GLT_ATTIBUTE_VERTEXvColor參數包含了要求的顏色。函數

//參數一:着色器屬性 
//參數二:須要的顏色
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]);
複製代碼

三、上色(Shaded)着色器

這種着色器惟一的Uniform值就是在幾何圖形中應用的變換矩陣。GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_COLOR在這種着色器中都會使用。顏色值將被平滑得插入頂點之間(這就是所謂的平滑着色)。ui

//參數一:着色器屬性 
//參數二:容許變化的4*4矩陣
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
複製代碼

四、默認光源着色器

這種着色器通俗點講,就是從觀察者的方向發出一個平行光所產生的效果。會使對象產生陰影和光照的效果。這裏須要模型視圖矩陣投影矩陣和做爲基本色的顏色值等Uniform值。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMALspa

//參數一:着色器屬性 
//參數二:模型視圖矩陣
//參數三:投影矩陣
//參數四:顏色值
GLShaderManager::UseStockShader(GLT_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);
複製代碼

五、點光源着色器

這個着色器跟默認光源着色器比較像,可是點光源着色器的光源位置是特定的。這種着色器接受4個Uniform值,即模型視圖矩陣投影矩陣、視圖座標系中的光源位置和對象的基本漫反射顏色。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMALcode

//參數一:着色器屬性 
//參數二:模型視圖矩陣
//參數三:投影矩陣
//參數四:視點座標光源位置
//參數五:顏色值
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);
複製代碼

六、紋理替換矩陣

着色器經過給定的模型視圖投影矩陣,使用綁定到nTextureUnit指定的紋理單元的紋理對幾何圖形進行變換。片斷顏色是直接從紋理樣本中直接獲取的。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMALorm

//參數一:着色器屬性 
//參數二:投影矩陣
//參數三:須要相乘的紋理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
複製代碼

七、紋理調整着色器

這種着色器將一個基本色乘以一個取自紋理單元的TextureUnit的紋理。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_TEXTURE0

//參數一:着色器屬性 
//參數二:投影矩陣
//參數三:顏色
//參數四:須要相乘的紋理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);
複製代碼

八、紋理光源着色器

這種着色器將一個紋理經過漫反射照明計算進行調整(相乘),光線在視覺空間中的位置是給定的。這種着色器接受5個Uniform值,即模型視圖矩陣投影矩陣、視覺空間中的光源位置、幾何圖形的基本色和將要使用的紋理單元。所需的屬性有GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_TEXTURE0GLT_ATTIBUTE_NORMAL

//參數一:着色器屬性 
//參數二:投影矩陣
//參數三:視圖空間中的光源位置
//參數四:幾何圖形的基本色
//參數五:將要使用的紋理單元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DEFF, GLfloat mvMatrix, GLfloat mvpMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4], GLint nTextureUnit);
複製代碼
相關文章
相關標籤/搜索