OpenGL ES 入門之旅--OpenGL 下的渲染流程和存儲著色器

在上一篇OpenGL 下的坐標系的最后部分,我們已經(jīng)了解了著色器渲染的流程。下面就來學習一下基礎(chǔ)圖形渲染管線。

OpenGL基礎(chǔ)圖形渲染管線

在OpenGL中,無論是使用可編程管線,還是使用固定管線,那么它的渲染管線流程都是一樣的。

首先我們來看一下渲染管線流程圖:
渲染管線流程圖.png
1.客戶端--服務端

管線分為上下2部分,上部分是Client客戶端,下半部分則是Server服務端。
這里的客戶端并非是我們在平時開發(fā)中說的iOS客戶端、Android客戶端。這里的客戶端指的是在CPU上所存儲的代碼,比如OpenGL的API和C/C++的代碼。這里的Server端調(diào)用的是GPU芯片,然后不斷從客戶端把數(shù)據(jù)(顏色)傳遞到服務端來執(zhí)行。
專業(yè)解釋為:客戶端是存儲在CPU存儲器中的,并且在應用程序中執(zhí)行,或者在主系統(tǒng)內(nèi)存的驅(qū)動程序中執(zhí)?。驅(qū)動程序會將渲染命令和數(shù)據(jù)組合起來,發(fā)送給服務器執(zhí)?。
客戶端和服務端在功能上也是異步的。 它們是各自獨立的軟件塊或硬 件塊。客戶端不不斷的把數(shù)據(jù)塊和命令塊組合在一起輸送到緩沖區(qū),然后緩沖區(qū)就會發(fā)送到服務器執(zhí)?。

2.著色器

著?器是使?用GLSL編寫的程序,看起來與C語??常類似。 著?器 須從源代碼中編譯和鏈接在一起。最終準備就緒的著?器程序。
四種著色器:頂點著色器(必要)、細分著色器(可選)、幾何著色器(可選)、片元著色器(必要)。頂點著色器和片元著色器 是每個OpenGL程序必不可少的部分,下面著重介紹一下。
頂點著色器:處理從客戶機輸?的數(shù)據(jù)、應?用變換、進行其他的類型的數(shù)學運算來計算關(guān)照效果、位移、顏?值等等,在渲染時有幾個頂點,頂點著色器執(zhí)行幾次,而且對每個點的執(zhí)行是同時的。
片元著色器:這是管線最后一部分,用來處理OpenGL 光柵化之后生成的單獨片元,在這個階段里面,計算一個偏遠的顏色和深度值,然后傳遞到管線的片元測試和混合的模塊。
如果說頂點著色器決定了一個圖元應該位于屏幕的什么位置,那么片元著色器就是決定片元的顏色。

3.向OpenGL 著色器傳遞渲染數(shù)據(jù)的三種通道

Attributes屬性:用來表示一個頂點的數(shù)據(jù),并且這個數(shù)據(jù)可能會不斷地改變,比如:顏色數(shù)據(jù),頂點數(shù)據(jù),紋理坐標,光照法線等;而且屬性可以是浮點型,整型,布爾型等等;

實際上,頂點位置本身 就是一個屬性,而且,屬性總是以四維向量的形式進行內(nèi)部存儲的,即使我們不會使?所有的 4個分量。?個頂點位置可能存儲(x,y,z),將占有4個分量中的3個。

Uniform:uniform變量是外部程序傳遞給頂點著色器和片元著色器的變量。uniform傳入的是一個比較統(tǒng)一的數(shù)據(jù),用于圖元(圖元:OpenGL 中的圖元只不過是頂點的集合以預定義的方式結(jié)合在一起罷了。)的批次處理,而不是每個頂點改變一次。比如:在頂點渲染中變換矩陣,光照參數(shù)和顏色空間轉(zhuǎn)換等信息。

Uniform變量實際上可以無數(shù)次限制地使用,設置一個應用于整個表面的單個顏色值,還可以設置一 個時間值。在每次渲染某種類型的頂點動畫時修改它。

Texture Data紋理數(shù)據(jù):紋理最通常的作用是裝飾我們的物體模型,使得物體表面擁有圖案。但在OpenGL中,紋理的作用不單單表現(xiàn)在圖形上,它也可以用來存儲大量的數(shù)據(jù),一個典型的例子就是利用紋理存儲地形信息。

Attributes屬性數(shù)據(jù)可以直接傳遞到頂點著色器,不可以直接傳遞到片元著色器,可以通過頂點著色器間接傳遞到片元著色器,(在設計Attributes時就設計成了只給頂點著色器使用)。
Uniform數(shù)據(jù)是可以直接傳遞到頂點著色器和片元著色器的。
Texture Data紋理數(shù)據(jù)也是可以直接傳遞到頂點著色器和片元著色器,(在頂點著?器、?元著?器中都可以對紋理數(shù)據(jù)進?采樣和篩選。)不過,一般情況下,紋理單元數(shù)據(jù)傳入頂點著色器是沒有必要的。(不過要根據(jù)場景來看,如果說有個應用場景是需要把紋理坐標放大,那么這是是就可以在頂點著色器完成,也可以在片元著色器完成。)

4.使用存儲著色器

在OpenGL 3.0以前的版本,OpenGL包含一個固定管線,它可以在不使用著色器的環(huán)境下處理幾何與像素數(shù)據(jù)。從3.1版本開始,固定管線從核心模式中去除,因此我們必須使用著色器來完成工作?,F(xiàn)代OpenGL渲染管線嚴重依賴著色器來處理傳入的數(shù)據(jù),我們一般會使用GLSL(OpenGL Shading Language)編寫著色器程序,GLSL語法類似于C語言,GLSL編譯以后運行在GPU端。下面我們就先來介紹著色器
4.1 存儲著色器
存儲著色器可以由GLTools的C++類GLShaderManager進行管理,GLShaderManager中的函數(shù)UseStockShader會選擇一個存儲著色器并提供這個著色器的Uniform值,該函數(shù)完成的東西就是對我們的頂點數(shù)據(jù)進一步的加工,比如設置頂點顏色,設置頂點光照的強度,設置頂點紋理等。
4.2 存儲著色器的使用
(1)GLShaderManager 的初始化

GLShaderManager  shaderManager;
shaderManager.InitializeStockShaders();

(2)GLShaderManager 的屬性
屬性類別.png

存儲著?色器為每?個變量都使用?致的內(nèi)部變量命名規(guī)則和相同的屬性槽。
(3)GLShanderManager 的 uniform值
一般情況下,要對幾何圖形進行渲染,我們需要給對象遞交屬性矩陣,?先要綁定我們想要使?用的著色程序上,并提供程序的uniform值。但是GLShanderManager類可以暫時的為我們來工作,利用useStockShader函數(shù),選擇一個存儲著色器并提供這個存儲著色器的Uniform的值。

GLShaderManager::UserStockShader(GLeunm shader...);

4.3 單元著色器(Identity)

GLShaderManager::UserStockShader(GLT_ATTRIBUTE_VERTEX,GLfloat vColor[4]);

單元著?器:只是簡單地使用默認笛卡爾坐標系(坐標范圍(-1.0, 1.0))。所有的片段都應用同一種顏色,?何圖形為實?和未渲染的。
需要設置存儲著?器?個屬性:GLT_ATTRIBUTE_VERTEX(頂點分量)
vColor[4] :表示需要設置的顏色

4.4 平面著色器(Flat)

GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);

平面著色器:平面著色器將統(tǒng)一著色器進行了渲染,允許為幾何圖形變換指定一個4x4的變換矩陣,經(jīng)常被稱為"模型視圖投影矩陣"; 在繪制圖形時,可以應用變換(模型/投影變化)。
參數(shù)GLT_SHADER_FLAT:表示平面著色器
參數(shù)GLfloat mvp[16]:表示允許變化的4x4矩陣
參數(shù)GLfloat vColor[4]:表示需要設置的顏色

4.5 上色著色器(Shaded)

GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);

上色著色器:在?何圖形中應用的變換矩陣。
需要設置存儲著?器的 GLT_ATTRIBUTE_VERTEX(頂點分量) 和GLT_ATTRIBUTE_COLOR(顏?分量) 2個屬性。顏?值將被平滑地插入頂點之間(稱之為平滑著色),
參數(shù)GLT_SHADER_SHADED:表示上色著色器
參數(shù)GLfloat mvp[16]:表示需要設置的顏色

4.6 默認光源著色器(Light)

GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);

默認光源著色器:默認光源著?器,會使繪制的圖形產(chǎn)生陰影和關(guān)照的效果。 需要設置存儲著?器的 GLT_ATTRIBUTE_VERTEX(頂點分量) 和GLT_ATTRIBUTE_NORMAL(表面法線)
可以把默認光源想象成太陽
參數(shù)GLT_SHADER_DEFAULT_LIGHT:表示默認光源著色器
參數(shù)GLfloat mvMatrix[16]:模型視圖矩陣4x4
參數(shù)GLfloat pMatrix[16]:投影矩陣4x4
參數(shù)GLfloat vColor[4]:顏色值

4.7 點光源著?器(Light_Dife)

GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);

點光源著色器:點光源著?器和默認光源著?器很相似,區(qū)別在于: 光源位置是特定的。同樣會使繪制的圖形產(chǎn)生陰影和光照效果, 同樣需要設置存儲著?器的 GLT_ATTRIBUTE_VERTEX(頂點分量) 和GLT_ATTRIBUTE_NORMAL(表?法線)。
參數(shù)GLT_SHADER_DEFAULT_LIGHT_DIEF: 表示點光源著?色器
參數(shù)GLfloat mvMatrix[16]: 模型視圖矩陣 4x4
參數(shù)GLfloat pMatrix[16]: 投影矩陣 4x4
參數(shù)GLfloat vLightPos[3]: 視點坐標光源位置
參數(shù)GLfloat vColor[4]: 漫反射的顏?值

4.8 紋理替換矩陣著色器(Replace)

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);

著?器通過給定的模型視圖投影矩陣,使?綁定到 nTextureUnit (紋理單元) 指定紋理單元的紋理對幾何圖形進行變化。
?段顏色:是直接從紋理樣本中直接獲取的。
需要設置存儲著?器的 GLT_ATTRIBUTE_VERTEX(頂點分量) 和GLT_ATTRIBUTE_NORMAL(表面法線)
參數(shù)GLT_SHADER_TEXTURE_REPLACE:紋理替換矩陣著色器
參數(shù)GLfloat mvMatrix[16]:模型視圖矩陣4x4
參數(shù)GLint nTextureUnit:紋理單元

4.9 紋理調(diào)整著?器

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,G
Lfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);

將一個紋理通過漫反射照明計算機進行調(diào)整(相乘)。光線在視覺空間中的位置是給定的。
需要設置存儲著?器的 GLT_ATTRIBUTE_VERTEX(頂點分量) 和GLT_ATTRIBUTE_TEXTURE0(紋理坐標)、GLT_ATTRIBUTE_NORMAL(表?法線)
參數(shù)GLT_SHADER_TEXTURE_MODULATE:紋理調(diào)整著?器
參數(shù)GLfloat mvMatrix[16]:模型視圖矩陣4x4
參數(shù)GLfloat vColor[4]:漫反射的顏?值
參數(shù)GLint nTextureUnit:紋理單元

4.10 紋理光源著?器

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);

這種著色器將?個紋理通過漫反射照明計算機進行調(diào)整(相乘)。光線在視覺空間中的位置是給定的。需要設置存儲著?器的 GLT_ATTRIBUTE_VERTEX(頂點分量) 和
GLT_ATTRIBUTE_TEXTURE0(紋理坐標)、GLT_ATTRIBUTE_NORMAL(表?法線)
參數(shù)GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF:表示紋理光源著?器
參數(shù)GLfloat mvMatrix[16]:模型矩陣4x4
參數(shù)GLfloat pMatrix[16]:投影矩陣4x4
參數(shù)GLfloat vLightPos[3]:視覺空間中點光源位置
參數(shù)GLfloat vBaseColor[4]:顏色值(幾何圖形的基本色)
參數(shù)GLint nTextureUnit:紋理單元

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容