OpenGL ES 3.0 圖元裝配

1. 前言

以前已經把紋理的渲染給弄出來了,可是又遇到一個新的問題,那就是圖元裝配,好比說我已經把圖片給顯示出來了,可是呢,並無作到讓它顯示到具體的位置,而跟這個位置相關的則須要靠圖元裝配。編程

圖元裝配發生在頂點着色器處理圖元頂點以後,在這一階段,執行裁剪、透視分割和視口變換操做。而光柵化是將圖元轉化爲一組二維片斷的過程,這些片斷由片斷着色器處理,表明能夠在屏幕上繪製的像素,發生在圖元裝配以後。函數

2. 圖元

能夠繪製圖元的包括下面的函數:對象

  • glDrawArrays
  • glDrawElements
  • glDrawRangeElements
  • glDrawArraysInstanced
  • glDrawElementsInstanced

其中這些函數能夠繪製三角形、直線和點精靈。索引

2.1 三角形

  1. GL_TRIANGLES:繪製一系列單獨的三角形;
  2. GL_TRIANGLE_STRIP:繪製一系列相互鏈接的三角形;
  3. GL_TRIANGLE_FAN:繪製一系列相連的三角形;

2.2 直線

  1. GL_LINES:繪製一系列不相連的線段;
  2. GL_LINE_STRIP:繪製一系列相連的線段;
  3. GL_LINE_LOOP:同上,相似;

2.3 點精靈

支持的圖元是GL_POINTS,點精靈對指定的每一個頂點繪製,點精靈一般用於將粒子效果看成點而非正方形繪製,從而實現高效渲染。點精靈是指定位置和半徑的屏幕對齊的正方形,位置描述正方形的中心,半徑用於計算描述點精靈的正方形的4個座標,。遊戲

2.4 繪製圖元

OpenGL ES中有5個繪製圖元的API調用,分別是文章開頭談到那5個,這裏須要注意的是,前面3個是常規的非實例化繪圖,後面兩個纔是實例化繪圖。圖片

2.4.1 glDrawArrays

glDrawArrays用元素索引爲first到first+count-1的元素指定的頂點繪製mode指定的圖元。須要注意的是,這裏的count並不意味着越大繪製的就越多,這裏僅僅是指頂點的個數,還須要看mode,是單獨的仍是相連的。內存

2.4.2 區別

若是你有一個由一系列順序元素索引描述的圖元,且幾何形狀的頂點不共享,則glDrawArrays很好用,可是,遊戲或者其餘3D應用程序使用的典型對象由多個三角形網格組成,其中的元素索引可能不必定按照順序,頂點通暢在網格的三角形之間共享,則使用glDrawElements會比較好,這有不少緣由,例如說,因爲頂點重用,頂點屬性數據的尺寸也較小,這也致使較小的內存佔用和內存帶寬需求。變量

好比畫一個由2個3角形組成的正方形,左上角座標是l,t,右下角座標是r,b
使用glDrawArrays繪製時,畫2個三角形,須要這樣傳:
(l,t),(r,t),(l,b)
(r,t),(r,b),(l,b)
而用glDrawElements畫的話能夠這樣
float coord[4][2]={{l,t},{r,t},{r,b},{l,b}};
繪製時:
0,1,3
1,2,3渲染

glDrawArrays傳輸或指定的數據是最終的真實數據,在繪製時效能更好
而glDrawElements指定的是真實數據的調用索引,在內存/顯存佔用上更節省。float

2.4.3 幾何形狀實例化

幾何形狀實例化很高效,能夠用一次API調用屢次渲染具備不一樣屬性(例如不一樣的變換矩陣、顏色或者大小)的一個對象。這一功能在渲染大量相似對象時頗有用,例如對人羣的渲染,這將會下降了向OpenGL ES引擎發送許多API調用的CPU開銷處理

glDrawArraysInstanced

glDrawElementsInstanced

那若是咱們想訪問其中的實例對象時怎麼辦呢?有兩種方法,分別是使用函數glVertexAttribDivisor,還有就是使用內建輸入變量gl_InstanceID做爲頂點着色器中的緩衝區索引,以訪問每一個實例的數據,不過前提是你使用的是幾何形狀實例化API調用,好比你使用的是非實例化繪圖調用,那麼gl_InstanceID將不會保存當前圖元實例的索引。

2.5 圖元重啓

使用圖元重啓後,能夠在一次繪圖調用中渲染多個不相連的圖元,以前咱們繪製不相連的也就是使用glDrawArrays,這對於下降繪圖API調用的開銷是不利的。

咱們能夠經過在索引列表中插入一個特殊索引來重啓一個用於索引繪圖調用(如glDrawElements、glDrawElementsInstanced 或 glDrawRangeElements)的圖元,這個特殊索引是該索引類型的最大可能索引,(例如,索引類型爲GL_UNSIGNED_BYTE爲255,而GL_UNSIGNED_SHORT則爲65535)。

注意,可使用代碼去啓用或者圖元重啓。

glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);

glDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX);

3. 圖元裝配

前面只是講到圖元的相關知識,從這裏開始便進行到真正的圖元裝配。

在圖元裝配階段,頂點着色器輸出會依次經歷:裁剪,透視分割,視口變換,纔會到光柵化階段。

(不得不說,仍是OpenGL 編程指南講得更詳細一些。。。)

相關文章
相關標籤/搜索