系列推薦文章:
OpenGL/OpenGL ES入門:圖形API以及專業名詞解析
OpenGL/OpenGL ES入門:渲染流程以及固定存儲着色器
OpenGL/OpenGL ES入門:圖像渲染實現以及渲染問題
OpenGL/OpenGL ES入門:基礎變換 - 初識向量/矩陣
OpenGL/OpenGL ES入門:紋理初探 - 經常使用API解析
OpenGL/OpenGL ES入門: 紋理應用 - 紋理座標及案例解析(金字塔)
OpenGL/OpenGL ES入門: 頂點着色器與片元着色器(OpenGL過渡OpenGL ES)
OpenGL/OpenGL ES入門: GLKit以及API簡介
OpenGL/OpenGL ES入門: GLKit使用以及案例編程
OpenGL
渲染流程圖解析bash
OpenGL
固定存儲着⾊器理解服務器
正如上圖所表示的,管線分爲上下2部分,上半部分時客戶端,下半部分爲服務器端。 服務器端和客戶端時功能和運行上都是異步的,它們是各自獨立的軟件塊和硬件塊。異步
在可編程管線中,咱們可以編碼的就是Vertex Shader
(頂點着色器) 和 Fragment Shader
(片元着色器),這也是渲染過程當中,必備的2個着色器。post
Vertex Shader
處理從客戶端輸入的數據、應用變換、進行其餘的類型的數學運算來計算光照效果、位移、顏色值等。爲了渲染共有3個頂點的三角形,Vertex Shader
將執行3次,也就是爲了每一個頂點執行一次。ui
圖中的Primitive Assembly
說明3個頂點已經組合在一塊兒,而三角形也已經逐個片斷的進行了光柵化。每一個片斷經過執行Fragment Shader
進行填充。Fragment Shader
會輸出咱們將屏幕上看到的最終顏色值。編碼
屬性: 就是一個對每一個頂點都要做改變的數據元素。實際上,頂點位置自己就是一個屬性。屬性能夠是浮點數、整數或布爾數據。spa
Uniform值: 一般設置Uniform
變量就緊接着發出渲染一個圖元批次的命令。能夠無限制的使用。設置一個應用於整個表面的單個顏色值,還能夠設置一個時間值。能夠是浮點數、整數或布爾數據。3d
紋理數據: Vertex Shader
和Fragment Shader
均可以對紋理值進行採樣和篩選。紋理數據的做用並不單單是表現圖形(後期詳解)。code
輸出: 輸出數據是做爲一個階段着色器的輸出定義的,而在後續階段的着色器則是做爲輸入(in)定義的。輸出類型的數據能夠簡單地從一個階段傳遞到下一個階段,也能夠以不一樣的方式插入。客戶端代碼接觸不到的變量。
3種想OpenGL着色器傳遞渲染數據的方法:
一、屬性
二、Uniform值
二、紋理
注意點: Attributes
不可以直接傳遞給Fragment Shader
,若是須要傳遞給Fragment Shader
,則須要經過Vertex Shader
間接的傳遞過去。而 Unifrom
和Texture Data
能夠直接傳遞給Vertex Shader
和Fragment Shader
具體怎麼傳遞,依需求而定。
// GLShaderManager初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
複製代碼
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
複製代碼
單位着色器:只是簡單地使用默認笛卡爾座標系(範圍-1.0~1.0)。全部的片斷都應用同一種顏色,幾何圖形爲實心和未渲染的。
參數1:存儲着色器種類 - 單元着色器
參數2:顏色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, FLfloat mvp[16], GLfloat vColor[4]);
複製代碼
平面着色器:將統一着色器進行了擴展,容許爲幾何圖形變換指定一個4x4變換矩陣。在繪製時,能夠應用變換(模型/投影變化)。
參數1:存儲着色器種類 - 平面着色器
參數2:容許變化的4x4矩陣
參數3:顏色
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
複製代碼
上色着色器:這種着色器惟一的
uniform
值就是在幾何圖形種應用的變換矩陣。GLT_ATTRIBUTE_VERTEX
(頂點份量)和GLT_ATTRIBUTE_COLOR
(顏色份量)在這種着色器中都會使用。顏色值將被平滑地插入頂點之間(稱爲平滑着色)。
參數1:存儲着色器種類 - 上色着色器
參數2:容許變化的4x4矩陣
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, FLfloat mvMatrix[16],GLfloat pMatrix[16], GLfloat vColor[4]);
複製代碼
默認光源着色器:使對象產生陰影和光照的效果。須要設置存儲着色器的
GLT_ATTRIBUTE_VERTEX
(頂點份量)和GLT_ATTRIBUTE_NORMAL
(表面法線)。
參數1:存儲着色器種類 - 默認光源着色器
參數2:模型4x4矩陣
參數3:投影4x4矩陣
參數4:顏色
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, FLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);
複製代碼
點光源着色器:點光源着色器和默認光源着色器很類似,可是光源位置多是特定的。一樣須要設置存儲着色器的
GLT_ATTRIBUTE_VERTEX
(頂點份量)和GLT_ATTRIBUTE_NORMAL
(表面法線)。
參數1:存儲着色器種類 - 點光源着色器
參數2:模型4x4矩陣
參數3:投影4x4矩陣
參數4:點光源的位置
參數5:顏色
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
複製代碼
紋理替換矩陣着色器:經過給定的模型視圖投影矩陣,使綁定到
nTextureUnit
指定的紋理單元的紋理對幾何圖形進行變換。片斷顏色時直接從紋理樣本中直接獲取的。所需的屬性有GLT_ATTRIBUTE_VERTEX
(頂點份量)和GLT_ATTRIBUTE_NORMAL
(表面法線)。 參數1:存儲着色器種類 - 紋理替換矩陣着色器 參數2:模型4x4矩陣 參數3:紋理單元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);
複製代碼
紋理調整着色器:將一個基本色乘以一個取自紋理單元
nTextureUnit
的紋理。所需的屬性有GLT_ATTRIBUTE_VERTEX
(頂點份量)和GLT_ATTRIBUTE_TEXTURE0
(紋理座標)。
參數1:存儲着色器種類 - 紋理調整着色器
參數2:模型4x4矩陣
參數3:顏色值
參數4:紋理單元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix, GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vBaseColor[4], GLint nTextureUnit);
複製代碼
紋理光源着色器:將一個紋理經過漫反射照明計算進行調整(相乘),廣西在視覺空間中的位置是給定的,這種着色器接受5個
Uniform
值,即模型視圖矩陣、投影矩陣、視覺空間中的光源位置、幾何圖形的基本色和將要使用的紋理單元。 所需的屬性有GLT_ATTRIBUTE_VERTEX
(頂點份量)、GLT_ATTRIBUTE_TEXTURE0
(紋理座標)和GLT_ATTRIBUTE_NORMAL
(表面法線)。 參數1:存儲着色器種類 - 紋理光源着色器 參數2:模型4x4矩陣 參數3:投影4x4矩陣 參數4:點光源位置 參數5:顏色值(幾何圖形的基本色) 參數6:紋理單元