OpenGL ES學習

在 OpenGL ES 中你必須創(chuàng)建兩種著色器:頂點著色器 (vertex shaders) 和片段著色器 (fragment shaders)。
相關概念
VertexShader 頂點著色器

FragmentShader 片段著色器

頂點著色器定義了在 2D 或者 3D 場景中幾何圖形是如何處理的。一個頂點指的是 2D 或者 3D 空間中的一個點。在圖像處理中,有 4 個頂點:每一個頂點代表圖像的一個角。頂點著色器設置頂點的位置,并且把位置和紋理坐標這樣的參數(shù)發(fā)送到片段著色器。

然后 GPU 使用片段著色器在對象或者圖片的每一個像素上進行計算,最終計算出每個像素的最終顏色。圖片,歸根結底,實際上僅僅是數(shù)據(jù)的集合。圖片的文檔包含每一個像素的各個顏色分量和像素透明度的值。因為對每一個像素,算式是相同的,GPU 可以流水線作業(yè)這個過程,從而更加有效的進行處理。使用正確優(yōu)化過的著色器,在 GPU 上進行處理,將使你獲得百倍于在 CPU 上用同樣的過程進行圖像處理的效率。

把東西渲染到屏幕上從一開始就是一個困擾 OpenGL 開發(fā)者的問題。僅僅讓屏幕呈現(xiàn)出非黑色就要寫很多樣板代碼和設置。開發(fā)者必須跳過很多坑 ,而這些坑所帶來的沮喪感以及著色器測試方法的匱乏,讓很多人放棄了哪怕是嘗試著寫著色器。

Uniforms 是一種外界和你的著色器交流的方式。Uniforms 是為在一個渲染循環(huán)里不變的輸入值設計的。如果你正在應用茶色濾鏡,并且你已經(jīng)指定了濾鏡的強度,那么這些就是在渲染過程中不需要改變的事情,你可以把它作為 Uniform 輸入。 Uniform 在頂點著色器和片段著色器里都可以被訪問到。

Attributes 僅僅可以在頂點著色器中被訪問。Attribute 是在隨著每一個頂點不同而會發(fā)生變動的輸入值,例如頂點的位置和紋理坐標等。頂點著色器利用這些變量來計算位置,以它們?yōu)榛A計算一些值,然后把這些值以 varyings 的方式傳到片段著色器。

最后,但同樣重要的,是 varyings 標簽。Varying 在頂點著色器和片段著色器都會出現(xiàn)。Varying 是用來在頂點著色器和片段著色器傳遞信息的,并且在頂點著色器和片段著色器中必須有匹配的名字。數(shù)值在頂點著色器被寫入到 varying ,然后在片段著色器被讀出。被寫入 varying 中的值,在片段著色器中會被以插值的形式插入到兩個頂點直接的各個像素中去。

可編程管線


776445-20151223012428077-1088396053.png

1.VBO/VAO(頂點緩沖區(qū)對象或頂點數(shù)組對象):

VBO/VAO是cpu提供給GPU的頂點信息,包括了頂點的位置、顏色(只是頂點的顏色,和紋理的顏色無關)、紋理坐標(用于紋理貼圖)等頂點信息。

2.VertexShader(頂點著色器):

頂點著色器是處理VBO/VAO提供的頂點信息的程序。VBO/VAO提供的每個頂點都執(zhí)行一遍頂點著色器。Uniforms(一種變量類型)在每個頂點保持一致,Attribute每個頂點都不同(可以理解為輸入頂點屬性)。執(zhí)行一次VertexShader輸出一個Varying和gl_positon。

776445-20151223012919374-1516274005.png

3.PrimitiveAssembly(圖元裝配):

頂點著色器下一個階段是圖元裝配,圖元(prmitive)是三角形、直線或者點精靈等幾何對象。這個階段,把頂點著色器輸出的頂點組合成圖元。

4.rasterization(光柵化):

光柵化是將圖元轉化為一組二維片段的過程,然后,這些片段由片段著色器處理(片段著色器的輸入)。這些二維片段代表著可在屏幕上繪制的像素。用于從分配給每個圖元頂點的頂點著色器輸出生成每個片段值的機制稱作插值(Interpolation)。這句不是人話的話解釋了一個問題,就是從cpu提供的分散的頂點信息是如何變成屏幕上密集的像素的,圖元裝配后頂點可以理解成變?yōu)閳D形,光柵化時可以根據(jù)圖形的形狀,插值出那個圖形區(qū)域的像素(紋理坐標v_texCoord、顏色等信息)。注意,此時的像素并不是屏幕上的像素,是不帶有顏色的。接下來的片段著色器完成上色的工作。

5.FragmentShader(片段著色器):

片段著色器為片段(像素)上的操作實現(xiàn)了通用的可編程方法,光柵化輸出的每個片段都執(zhí)行一遍片段著色器,對光柵化階段生成每個片段執(zhí)行這個著色器,生成一個或多個(多重渲染)顏色值作為輸出。

776445-20151223012919374-1516274005.png

6.Per-Fragment Operations(逐片段操作)

在此階段,每個片段上執(zhí)行如下功能:

776445-20151223013739749-765976931.png

1)pixelOwnershipTest(像素歸屬測試):

這個用來確定幀緩沖區(qū)中位置(x,y)的像素是不是歸當前上下文所有。例如,如果一個顯示幀緩沖區(qū)窗口被另一個窗口所遮蔽,則窗口系統(tǒng)可以確定被遮蔽的像素不屬于此opengl的上下文,從而不顯示這些像素。

(2)ScissorTest(剪裁測試):

如果該片段位于剪裁區(qū)域外,則被拋棄

(3)StencilTest and DepthTest(模板和深度測試):

深度測試比較好理解,若片段著色器返回的深度小于緩沖區(qū)中的深度,則舍棄。模板測試沒有用過,不清楚具體功能,猜測功能應該和名字一樣,模板形狀內可通過。

(4)Blending(混合):

將新生成的片段顏色值與保存在幀緩沖區(qū)的顏色值組合起來,產(chǎn)生新的RGBA。

(5)dithering(抖動):

最后把產(chǎn)生的片段放到幀緩沖區(qū)(前緩沖區(qū)或后緩沖區(qū)或FBO)中,若不是FBO,則屏幕繪制緩沖區(qū)中的片段,產(chǎn)生屏幕上的像素。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容