系列推薦文章:
OpenGL/OpenGL ES入門:圖形API以及專業名詞解析
OpenGL/OpenGL ES入門:渲染流程以及固定儲存著色器
OpenGL/OpenGL ES入門:影象渲染實現以及渲染問題
OpenGL/OpenGL ES入門:基礎變換 - 初識向量/矩陣
OpenGL/OpenGL ES入門:紋理初探 - 常用API解析
OpenGL/OpenGL ES入門:紋理應用 - 紋理座標及案例解析(金字塔)
本篇目標
-
OpenGL
渲染流程圖解析 -
OpenGL
固定儲存著⾊器理解
OpenGL渲染流程
正如上圖所表示的,管線分為上下2部分,上半部分時客戶端,下半部分為伺服器端。 伺服器端和客戶端時功能和執行上都是非同步的,它們是各自獨立的軟體塊和硬體塊。
在可程式設計管線中,我們能夠編碼的就是Vertex Shader
(頂點著色器) 和 Fragment Shader
(片元著色器),這也是渲染過程中,必備的2個著色器。
Vertex Shader
處理從客戶端輸入的資料、應用變換、進行其他的型別的數學運算來計算光照效果、位移、顏色值等。為了渲染共有3個頂點的三角形,Vertex Shader
將執行3次,也就是為了每個頂點執行一次。
圖中的Primitive Assembly
說明3個頂點已經組合在一起,而三角形也已經逐個片段的進行了光柵化。每個片段通過執行Fragment Shader
進行填充。Fragment Shader
會輸出我們將螢幕上看到的最終顏色值。
-
屬性: 就是一個對每個頂點都要作改變的資料元素。實際上,頂點位置本身就是一個屬性。屬性可以是浮點數、整數或布林資料。
-
Uniform值: 通常設定
Uniform
變數就緊接著發出渲染一個圖元批次的命令。可以無限制的使用。設定一個應用於整個表面的單個顏色值,還可以設定一個時間值。可以是浮點數、整數或布林資料。 -
紋理資料:
Vertex Shader
和Fragment Shader
都可以對紋理值進行取樣和篩選。紋理資料的作用並不僅僅是表現圖形(後期詳解)。 -
輸出: 輸出資料是作為一個階段著色器的輸出定義的,而在後續階段的著色器則是作為輸入(in)定義的。輸出型別的資料可以簡單地從一個階段傳遞到下一個階段,也可以以不同的方式插入。客戶端程式碼接觸不到的變數。
3種想OpenGL著色器傳遞渲染資料的方法:
1、屬性
2、Uniform值
2、紋理
注意點: Attributes
不能夠直接傳遞給Fragment Shader
,如果需要傳遞給Fragment Shader
,則需要通過Vertex Shader
間接的傳遞過去。而 Unifrom
和Texture Data
可以直接傳遞給Vertex Shader
和Fragment Shader
具體怎麼傳遞,依需求而定。
固定儲存著色器的分類
儲存著色器的使用
GLShaderManager的初始化
// GLShaderManager初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
複製程式碼
單位(Identity)著色器
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
複製程式碼
單位著色器:只是簡單地使用預設笛卡爾座標系(範圍-1.0~1.0)。所有的片段都應用同一種顏色,幾何圖形為實心和未渲染的。
引數1:儲存著色器種類 - 單元著色器
引數2:顏色
平面(Flat)著色器
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, FLfloat mvp[16], GLfloat vColor[4]);
複製程式碼
平面著色器:將統一著色器進行了擴充套件,允許為幾何圖形變換指定一個4x4變換矩陣。在繪製時,可以應用變換(模型/投影變化)。
引數1:儲存著色器種類 - 平面著色器
引數2:允許變化的4x4矩陣
引數3:顏色
上色(Shaded)著色器
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:紋理單元