1. 程式人生 > >OpenGL ES 3.0 渲染管線介紹

OpenGL ES 3.0 渲染管線介紹

一、前言

  • OpenGL 1.x 系列採用的還是固定功能管線。
  • 從 OpenGL ES 2.0 開始採用了可程式設計圖形管線。
  • 而 OpenGL ES 3.0 相容了 2.0,並加入了很多 2.0 不具備的功能。
  • Android 4.3 之後開始支援 OpenGL ES 3.0。

二、渲染管線

記住下面這張圖,其中帶陰影的方框表示 OpenGL ES 3.0 管線中可程式設計階段。
在這裡插入圖片描述

1. 頂點著色器

頂點著色器主要進行頂點相關的一些操作。可以用於通過矩陣變換位置、計算照明公式來生成逐頂點顏色以及生成或者變換紋理座標等基於頂點的傳統操作。產生紋理座標、顏色、點位置等資訊送往後續階段。

2. 圖元裝配

頂點被組合成圖元的過程叫做 圖元裝配。圖元是指點、直線和三角形。
該過程還有兩個重要操作:裁剪和淘汰。裁剪是指對於不在視錐體(螢幕上可見的3D區域)內的圖元進行裁剪;淘汰是指根據圖元面向前方或後方選擇拋棄它們(如物體內部的點)。

3. 光柵化

將圖片轉化為片段(fragment)的過程叫做 光柵化。在這裡,虛擬3D世界中的物體投影到平面上,並生成一系列的片段。
而將每個圖元頂點輸出生成每個片段值的機制叫做 插值
片段(fragment)可以簡單的理解為帶有深度等資訊的畫素點。螢幕上的一個畫素點可能對應多個片段。

4. 片段著色器

通常我們在這裡對片段進行處理(紋理取樣、顏色彙總等),將每個片段的顏色等屬性計算出來並送給後續階段。

5. 逐片段操作

這裡又包括下圖所示一些步驟:
在這裡插入圖片描述

畫素歸屬測試

判斷當前畫素是否歸 OpenGL 所有,即 OpenGL ES 幀緩衝區視窗的部分被另一個視窗所遮蔽,則被遮擋畫素不屬於 OpenGL 上下文。

裁剪測試

判斷當前畫素是否位於剪裁矩形範圍內,如果位於裁剪區域外則被拋棄。

模板測試

模板測試主要將繪製區域限定在一定範圍內,一般用在湖面倒影、映象等場合。

深度測試

深度測試是將輸入片元的深度與幀緩衝區中對應片元的深度進行比較,確定片段是否應該被拒絕。

混合

將新生成的片段和儲存在緩衝區的片段進行混合。

抖動

用於最小化因為使用有限精度在幀緩衝區中儲存顏色值而產生的偽像,使用少量顏色模擬更寬的顏色範圍。

6. 幀緩衝區

OpenGL 管線的最終渲染目的地被稱作幀快取(framebuffer)。