android平臺下OpenGL ES 3.0從零開始
OpenGL ES 3.0學習實踐
- android平臺下OpenGL ES 3.0從零開始
- android平臺下OpenGL ES 3.0繪製純色背景
- android平臺下OpenGL ES 3.0繪製圓點、直線和三角形
- android平臺下OpenGL ES 3.0繪製彩色三角形
- android平臺下OpenGL ES 3.0從矩形中看矩陣和座標系
目錄
- OpenGL ES對Android平臺的支援情況
- OpenGL ES 3.0概述
- OpenGL ES 3.0圖形管線圖
- 頂點著色器
- 片段著色器
- 圖元裝配
- 光柵化
- 逐片段操作
- 虛擬機器和OpenGL ES 3.0的資料傳輸
OpenGL ES對Android平臺的支援情況
OpenGL ES當前主要版本有1.0/1.1/2.0/3.0/3.1
。
OpenGL ES版本 | Android版本 | 描述 |
---|---|---|
OpenGL ES1.0 | Android 1.0+ | OpenGL ES 1.x是針對固定硬體管線的,Android 1.0和更高的版本支援這個API規範。 |
OpenGL ES2.0 | Android 2.2(API 8)+ |
OpenGL ES 2.x是針對可程式設計硬體管線的,不相容OpenGL ES 1.x,Android 2.2(API 8)和更高的版本支援這個API規範。 |
OpenGL ES3.0 | Android 4.3(API 18)+ | 向下相容OpenGL ES 2.x,Android 4.3(API 18)及更高的版本支援這個API規範。 |
OpenGL ES3.1 | Android 5.0 (API 21)+ | 向下相容OpenGL ES3.0/2.0,Android 5.0(API 21)和更高的版本支援這個API規範 |
OpenGL ES 3.0概述
OpenGL ES 3.0實現了具有可程式設計著色功能的圖形管線,由兩個規範組成:OpenGL ES 3.0 API 規範
和OpenGL ES著色語言3.0規範(OpenGL ES SL)
。
OpenGL ES 3.0圖形管線圖
頂點著色器
頂點著色器實現了頂點操作的通用可程式設計方法,著色器(Shader)是在GPU上執行的小程式
。
頂點著色器的輸入包括:
- 著色器程式一一描述頂點上執行操作的頂點著色器程式原始碼或者可執行檔案。
- 頂點著色器輸人(或者屬性)一一用頂點陣列提供的每個頂點的資料。
- 統一變數(
uniform
)一一頂點(或者片段)著色器使用的不變資料。 - 取樣器一一代表頂點著色器使用紋理的特殊統一變數型別。
頂點著色器的輸入輸出模型
頂點著色器取得一個位置及相關的顏色資料作為輸入屬性,用一個 4x4矩陣變換位置,並輸出變換後的位置和顏色。
#version 300 es
uniform mat4 u_mvpMatrix;
int vec4 a_postion;
int vec4 a_color;
out vec4 v_color;
void main(){
v_color = a_color;
gl_Position = u_mvpMatrix * a_postion
}
片段著色器
片段著色器片段著色器為片段上的操作實現了通用的可程式設計方法。
對光柵化階段生成的每個片段執行這個著色器,採用如下輸入:
- 著色器程式——描述片段上所執行操作的片段著色器程式原始碼或者可執行檔案。
- 輸人變數——光姍化單元用插值為每個片段生成的頂點著色器鈞出。
- 統一變數——片段(或者頂點)著色器使用的不變資料。
- 取樣器——討七表片段著色器所用紋理的特殊統一變數型別。
圖元裝配
圖元裝配頂點著色器之後, 0pennGL ES 3.0 圖形管線的下一階段就是圖元裝配。
`圖元(Primitive)是三角形、直線或者點精靈等幾何物件。圖元的每個頂點被髮送到頂點著色器的不同拷貝。
在圖元裝配期間,這些頂點被組合成圖元。對於每個圖元,必須確定圖元是否位於視錐體(螢幕上可見的 3D 空間區域)內。如果圖元沒有完全在視錐體內,則可能需要進行裁剪。如果圖元完全處於該區域之外,它就會被拋棄。裁剪之後,頂點位置被轉換為螢幕座標。也可以執行一次淘汰操作,根據圖元面向前方或者後方拋棄它們。裁剪和淘汰之後,圖元便準備傳遞給管線的下一階段 ― 光柵化階段。
光柵化
下一階段是光柵化,在此階段繪製對應的圖元(點精靈、直線或者三角形)。光柵化是將圖元轉化為一組二維片段的過程,然後,這些片段由片段著色器處理。這些二維片段代表著可在螢幕上繪製的畫素。
OpenGL ES 3.0 光柵化階段
逐片段操作
片段著色器之後,下一個階段就是逐片段操作
。
OpenGL ES 資料儲存
android中的程式都是執行在虛擬機器
中的,而OpenGL
作為本地系統庫是執行在硬體上的,虛擬機器與OpenGL
資料傳輸的方式由兩種
- 第一種:使用Java呼叫本地介面
JNI
的方式,當我們使用GLES20包
裡的方法時,內部實現其實就是呼叫本地方法。 - 第二種:改變記憶體的分配方式,Java當中有個特殊的類(如
ByteBuffer
)集合,可以直接分配本地記憶體塊,並把Java的資料複製到本地記憶體,本地記憶體可以被本地環境存取,而不受垃圾回收器管控。
從虛擬機器到本地環境的資料傳輸過程
參考:
《OpenGL ES 3.0 程式設計指南第2版》
《OpenGL ES應用開發實踐指南Android卷》