OpenGL 渲染管線流程解析

這張圖對於想要掌握OpenGL的開發者很是重要.並且第一次看也許你們對於它的理解會比較薄. 但願你們能後期可以多看這個圖. 由於咱們在處理任何圖形渲染,都是依據它. 基於OpenGL 封裝的框架都是也都是遵循這個圖的規則.數組

接下來,咱們來了解2個很是重要的端.服務器

客戶端,服務端

這裏的客戶端和服務端並非咱們常說的iOS/安卓並稱爲客戶端,後臺稱爲服務端. 在這個圖中,管線分爲上下2部分,上部分是客戶端,而下半部分則是服務端。微信

  • 客戶端是存儲在CPU存儲器中的,而且在應用程序中執行,或者在主系統內存的驅動程序中執行。驅動程序會將渲染命令和數組組合起來,發送給服務器執行!(在一臺典型的我的計算機上,服務器就是實際上就是圖形加速卡上的硬件和內存)
  • 服務器和客戶機在功能上也是異步的。它們是各自獨立的軟件塊或硬件塊。咱們是但願它們2個端都儘可能在不停的工做。客戶端不斷的把數據塊和命令塊組合在一塊兒輸送到緩衝區,而後緩衝區就會發送到服務器執行。
  • 若是服務器中止工做等待客戶機,或者客戶機中止工做來等待服務器作好接受更多的命令和準備,咱們把這種狀況成爲管線停滯

着色器

上圖的Vertex Shader(頂點着色器) 和 Fragment Shader(片斷着色器)。框架

  • 着色器是使用GLSL編寫的程序,看起來與C語言很是相似。 着色器必須從源代碼中編譯和連接在一塊兒。最終準備就緒的着色器程序
  • 頂點着色器-->處理從客戶機輸入的數據、應用變換、進行其餘的類型的數學運算來計算關照效果、位移、顏色值等等。(**爲了渲染共有3個頂點的三角形,頂點着色器將執行3次,也就是爲了每一個頂點執行一次)在目前的硬件上有多個執行單元同時運行,就意味着全部的3個頂點能夠同時進行處理!
  • ==圖上(primitive Assembly== 說明的是:3個頂點已經組合在一塊兒,而三角形已經逐個片斷的進行了光柵化。每一個片斷經過執行 片元着色器 進行填充。片元着色器會輸出咱們將屏幕上看到的最終顏色值。
重點!
咱們必須在這以前爲着色器提供數據,不然什麼都沒法實現!
有3種向OpenGL 着色器傳遞渲染數據的方法可供咱們選擇
1.屬性
2.uniform 值
3.紋理

屬性、uniform值、紋理、輸出

屬性

屬性:就是對每個頂點都要做改變的數據元素。實際上,頂點位置自己就是一個屬性。屬性值能夠是浮點數、整數、布爾數據。異步

  • 屬性老是以四維向量的形式進行內部存儲的,即便咱們不會使用全部的4個份量。一個頂點位置可能存儲(x,y,z),將佔有4個份量中的3個。
  • 實際上若是是在平面狀況下:只要在xy平面上就能繪製,那麼Z份量就會自動設置爲0;
  • 屬性還能夠是:紋理座標、顏色值、關照計算表面法線
  • 在頂點程序(shader渲染)能夠表明你想要的任何意義。由於都是你設定的。
  • 屬性會從本地客戶機內存中複製存儲在圖形硬件中的一個緩衝區上。這些屬性只提供給頂點着色器使用,對於片元着色器木有太大意義。
  • 聲明:這些屬性對每一個頂點都要作改變,但並不意味着它們的值不能重複。一般狀況下,它們都是不同的,但有可能整個數組都是同一值的狀況。

Uniform值

屬性是一種對整個批次屬性都取統一值的單一值。它是不變的。經過設置uniform變量就緊接着發送一個圖元批次命令,Uniform變量實際上能夠無數次限制地使用,設置一個應用於整個表面的單個顏色值,還能夠設置一個時間值。在每次渲染某種類型的頂點動畫時修改它。學習

  • 注意:這裏的uniform 變量每一個批次改變一次,而不是每一個頂點改變一次。
  • uniform變量最多見的應用是在頂點渲染中設置變換矩陣
  • 與屬性相同點:能夠是浮點值、整數、布爾值
  • 與屬性不一樣點:頂點着色器和片元着色器均可以使用uniform變量。uniform 變量還能夠是標量類型、矢量類型、uniform矩陣。

紋理

傳遞給着色器的第三種數據類型:紋理數據動畫

  • 在頂點着色器、片斷着色器中均可以對紋理數據進行採樣和篩選。
  • 典型的應用場景:片斷着色器對一個紋理值進行採樣,而後在一個三角形表面應用渲染紋理數據。
  • 紋理數據,不只僅表如今圖形,不少圖形文件格式都是以無符號字節(每一個顏色通道8位)形式對顏色份量進行存儲的。

輸出

在圖表中第四種數據類型是輸出(out);輸出數據是做爲一個階段着色器的輸出定義的,二後續階段的着色器則做爲輸入定義。spa

  • 輸出數據能夠簡單的從一個階段傳遞到下一個階段,也能夠用不一樣的方式插入。
  • 客戶端的代碼接觸不到這些內部變量咱們的OpenGL開發暫時接觸不到。
小編這呢,給你們推薦一個優秀的iOS交流平臺,平臺裏的夥伴們都是很是優秀的iOS開發人員,咱們專一於技術的分享與技巧的交流,你們能夠在平臺上討論技術,交流學習。歡迎你們的加入(想要進入的可加小編微信15673450590)。
相關文章
相關標籤/搜索