OpenGL ES 3.0圖形管線圖

相比于2.0版的圖形管線圖,OpenGLES3.0新增了一個功能——變換反饋,使頂點著色器輸出可以選擇性地寫入一個輸出緩沖區(qū)(除了傳遞給片段著色器之外,也可用這種傳遞替代)
術語介紹
- 管線,Pipeline,顯卡執(zhí)行的、從幾何體到最終渲染圖像的、數(shù)據(jù)傳輸處理計算的過程
OpenGLES1.X中它是固定管道,整體式封閉的,中間的各道工藝按固定的流程順序走。 - 幾何圖元:包括點、直線、三角形,均是通過頂點(vertex)來指定的。
- 模型:根據(jù)幾何圖元創(chuàng)建的物體。
- 渲染:計算機根據(jù)模型創(chuàng)建圖像的過程。
-FrameBuffer:幀緩沖區(qū),幀緩沖區(qū)保存了圖形硬件為了控制屏幕上所有像素的顏色和強度所需要的全部信息。
渲染管線的幾個關鍵階段
1. 為頂點緩沖區(qū)指定幾何對象
所謂幾何對象,就是上面說過的幾何圖元,這里將根據(jù)具體執(zhí)行的指令繪制幾何圖元。比如,OpenGL提供給開發(fā)者的繪制方法glDrawArrays,這個方法里面的第一個參數(shù)是mode,就是制定繪制方式,可選值有以下幾種。
- GL_POINTS:以點的形式進行繪制,通常用在繪制粒子效果的場景中。
- GL_LINES:以線的形式進行繪制,通常用在繪制直線的場景中。
- GL_TRIANGLE_STRIP:以三角形的形式進行繪制,所有二維圖像的渲染都會使用這種方式。
2. 在頂點著色器中進行可編程的頂點處理
不論以上的幾何對象是如何指定的,所有的幾何數(shù)據(jù)都將會經(jīng)過這個階段。這個階段所做的操作就是,根據(jù)模型視圖和投影矩陣進行變換來改變頂點的位置,根據(jù)紋理坐標與紋理矩陣來改變紋理坐標的位置,如果涉及三維的渲染,那么這里還要處理光照計算和法線變換(本書不會涉及三維的渲染)。這里的輸出是以gl_Position來表示具體的頂點位置的,如果是以點(GL_POINTS)來繪制幾何圖元,那么還應該輸出gl_PointSize。
3. 圖元裝配
在經(jīng)過步驟2的頂點處理操作之后,不論是模型的頂點,還是紋理坐標都是已經(jīng)確定好了的。在這個階段,頂點將會根據(jù)應用程序送往圖元的規(guī)則(如GL_POINTS、GL_TRIANGLES等),將紋理組裝成圖元。
對于每個圖元,必須確定圖元是否位于視錐體(屏幕上可見的 3D 空間區(qū)域)內(nèi)。如果圖元沒有完全在視錐體內(nèi),則可能需要進行裁剪。如果圖元完全處于該區(qū)域之外,它就會被拋棄。裁剪之后,頂點位置被轉(zhuǎn)換為屏幕坐標。也可以執(zhí)行一次淘汰操作,根據(jù)圖元面向前方或者后方拋棄它們。裁剪和淘汰之后,圖元便準備傳遞給管線的下一階段 ― 光柵化階段。
4. 光柵化
光柵化是將圖元轉(zhuǎn)化為一組二維片段的過程,圖元數(shù)據(jù)在此將會被分解成更小的單元并對應于幀緩沖區(qū)的各個像素。這些單元稱為片段,一個片段可能包含窗口顏色、紋理坐標等屬性。片段的屬性是根據(jù)頂點坐標利用插值來確定的,這其實就是柵格化操作,也就是確定好每一個片段的屏幕坐標、顏色、紋理坐標等屬性。
5. 在片段著色器進行可編程的片段處理
通過紋理坐標取得紋理(texture)中相對應的片段像素值(texel),根據(jù)自己的業(yè)務處理(比如提亮、飽和度調(diào)節(jié)、對比度調(diào)節(jié)、高斯模糊等)來變換這個片段的顏色。這里的輸出是gl_FragColor,用于表示修改之后的像素的最終結果。
6. 幀緩沖操作
該階段主要執(zhí)行幀緩沖的寫入操作,這也是渲染管線的最后一步,負責將最終的像素值寫到幀緩沖區(qū)中。
7. glFinish和glFlush
提交給OpenGL的繪圖指令并不會馬上發(fā)送給圖形硬件執(zhí)行,而是放到一個緩沖區(qū)里面,等待緩沖區(qū)滿了之后再將這些指令發(fā)送給圖形硬件執(zhí)行,所以指令較少或較簡單時是無法填滿緩沖區(qū)的,這些指令自然不能馬上執(zhí)行以達到所需要的效果。因此每次寫完繪圖代碼,需要讓其立即完成效果時,開發(fā)者都需要在代碼后面添加glFlush()或glFinish()函數(shù)。
- glFlush()的作用是將緩沖區(qū)中的指令(無論是否為滿)立刻發(fā)送給圖形硬件執(zhí)行,發(fā)送完立即返回。
- glFinish()的作用也是將緩沖區(qū)中的指令(無論是否為滿)立刻發(fā)送給圖形硬件執(zhí)行,但是要等待圖形硬件執(zhí)行完成之后才返回這些指令。
在上面介紹的渲染流程中,步驟2和步驟5提供了可編程的著色器來代替OpenGL ES中渲染管線的某一階段,后面的筆記中會學習到具體如何實現(xiàn)頂點著色器和片元著色器