OpenGL/OpenGL ES入門: 渲染流程以及固定儲存著色器

佐籩發表於2019-05-14

系列推薦文章:
OpenGL/OpenGL ES入門:圖形API以及專業名詞解析
OpenGL/OpenGL ES入門:渲染流程以及固定儲存著色器
OpenGL/OpenGL ES入門:影象渲染實現以及渲染問題
OpenGL/OpenGL ES入門:基礎變換 - 初識向量/矩陣
OpenGL/OpenGL ES入門:紋理初探 - 常用API解析
OpenGL/OpenGL ES入門:紋理應用 - 紋理座標及案例解析(金字塔)

本篇目標

  • OpenGL 渲染流程圖解析

  • 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 ShaderFragment Shader都可以對紋理值進行取樣和篩選。紋理資料的作用並不僅僅是表現圖形(後期詳解)。

  • 輸出: 輸出資料是作為一個階段著色器的輸出定義的,而在後續階段的著色器則是作為輸入(in)定義的。輸出型別的資料可以簡單地從一個階段傳遞到下一個階段,也可以以不同的方式插入。客戶端程式碼接觸不到的變數。

3種想OpenGL著色器傳遞渲染資料的方法:
1、屬性
2、Uniform值
2、紋理

注意點: Attributes不能夠直接傳遞給Fragment Shader,如果需要傳遞給Fragment Shader,則需要通過Vertex Shader間接的傳遞過去。而 UnifromTexture Data可以直接傳遞給Vertex ShaderFragment 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:紋理單元

相關文章