OpenGL ES 3.0學(xué)習(xí)實(shí)踐
- android平臺(tái)下OpenGL ES 3.0從零開始
- android平臺(tái)下OpenGL ES 3.0繪制純色背景
- android平臺(tái)下OpenGL ES 3.0繪制圓點(diǎn)、直線和三角形
- android平臺(tái)下OpenGL ES 3.0繪制彩色三角形
- android平臺(tái)下OpenGL ES 3.0從矩形中看矩陣和正交投影
- android平臺(tái)下OpenGL ES 3.0著色語言基礎(chǔ)知識(shí)(上)
- android平臺(tái)下OpenGL ES 3.0著色語言基礎(chǔ)知識(shí)(下)
- android平臺(tái)下OpenGL ES 3.0實(shí)例詳解頂點(diǎn)屬性督禽、頂點(diǎn)數(shù)組
- android平臺(tái)下OpenGL ES 3.0實(shí)例詳解頂點(diǎn)緩沖區(qū)對象(VBO)和頂點(diǎn)數(shù)組對象(VAO)
- android平臺(tái)下OpenGLES3.0繪制立方體的幾種方式
目錄
- OpenGL ES對Android平臺(tái)的支持情況
- OpenGL ES 3.0概述
- OpenGL ES 3.0圖形管線圖
- 頂點(diǎn)著色器
- 片段著色器
- 圖元裝配
- 光柵化
- 逐片段操作
- 虛擬機(jī)和OpenGL ES 3.0的數(shù)據(jù)傳輸
OpenGL ES對Android平臺(tái)的支持情況
OpenGL ES當(dāng)前主要版本有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和更高的版本支持這個(gè)API規(guī)范份汗。 |
OpenGL ES2.0 | Android 2.2(API 8)+ | OpenGL ES 2.x是針對可編程硬件管線的,不兼容OpenGL ES 1.x,Android 2.2(API 8)和更高的版本支持這個(gè)API規(guī)范琉苇。 |
OpenGL ES3.0 | Android 4.3(API 18)+ | 向下兼容OpenGL ES 2.x脱篙,Android 4.3(API 18)及更高的版本支持這個(gè)API規(guī)范娇钱。 |
OpenGL ES3.1 | Android 5.0 (API 21)+ | 向下兼容OpenGL ES3.0/2.0,Android 5.0(API 21)和更高的版本支持這個(gè)API規(guī)范 |
OpenGL ES 3.0概述
OpenGL ES 3.0實(shí)現(xiàn)了具有可編程著色功能的圖形管線绊困,由兩個(gè)規(guī)范組成:OpenGL ES 3.0 API 規(guī)范
和OpenGL ES著色語言3.0規(guī)范(OpenGL ES SL)
文搂。
OpenGL ES 3.0圖形管線圖
頂點(diǎn)著色器
頂點(diǎn)著色器實(shí)現(xiàn)了頂點(diǎn)操作的通用可編程方法,著色器(Shader)是在GPU上運(yùn)行的小程序
考抄。
頂點(diǎn)著色器的輸入包括:
- 著色器程序一一描述頂點(diǎn)上執(zhí)行操作的頂點(diǎn)著色器程序源代碼或者可執(zhí)行文件细疚。
- 頂點(diǎn)著色器輸人(或者屬性)一一用頂點(diǎn)數(shù)組提供的每個(gè)頂點(diǎn)的數(shù)據(jù)。
- 統(tǒng)一變量(
uniform
)一一頂點(diǎn)(或者片段)著色器使用的不變數(shù)據(jù)川梅。 - 采樣器一一代表頂點(diǎn)著色器使用紋理的特殊統(tǒng)一變量類型疯兼。
頂點(diǎn)著色器的輸入輸出模型
頂點(diǎn)著色器取得一個(gè)位置及相關(guān)的顏色數(shù)據(jù)作為輸入屬性,用一個(gè) 4x4矩陣變換位置贫途,并輸出變換后的位置和顏色吧彪。
#version 300 es
uniform mat4 u_mvpMatrix;
in vec4 a_postion;
in vec4 a_color;
out vec4 v_color;
void main(){
v_color = a_color;
gl_Position = u_mvpMatrix * a_postion
}
片段著色器
片段著色器片段著色器為片段上的操作實(shí)現(xiàn)了通用的可編程方法。
對光柵化階段生成的每個(gè)片段執(zhí)行這個(gè)著色器丢早,采用如下輸入:
- 著色器程序——描述片段上所執(zhí)行操作的片段著色器程序源代碼或者可執(zhí)行文件姨裸。
- 輸人變量——光姍化單元用插值為每個(gè)片段生成的頂點(diǎn)著色器鈞出。
- 統(tǒng)一變量——片段(或者頂點(diǎn))著色器使用的不變數(shù)據(jù)怨酝。
- 采樣器——討七表片段著色器所用紋理的特殊統(tǒng)一變量類型傀缩。
圖元裝配
圖元裝配頂點(diǎn)著色器之后, 0pennGL ES 3.0 圖形管線的下一階段就是圖元裝配农猬。
`圖元(Primitive)是三角形赡艰、直線或者點(diǎn)精靈等幾何對象。圖元的每個(gè)頂點(diǎn)被發(fā)送到頂點(diǎn)著色器的不同拷貝斤葱。
在圖元裝配期間慷垮,這些頂點(diǎn)被組合成圖元。對于每個(gè)圖元揍堕,必須確定圖元是否位于視錐體(屏幕上可見的 3D 空間區(qū)域)內(nèi)料身。如果圖元沒有完全在視錐體內(nèi),則可能需要進(jìn)行裁剪衩茸。如果圖元完全處于該區(qū)域之外芹血,它就會(huì)被拋棄。裁剪之后,頂點(diǎn)位置被轉(zhuǎn)換為屏幕坐標(biāo)祟牲。也可以執(zhí)行一次淘汰操作隙畜,根據(jù)圖元面向前方或者后方拋棄它們。裁剪和淘汰之后说贝,圖元便準(zhǔn)備傳遞給管線的下一階段 ― 光柵化階段议惰。
光柵化
下一階段是光柵化,在此階段繪制對應(yīng)的圖元(點(diǎn)精靈乡恕、直線或者三角形)言询。光柵化是將圖元轉(zhuǎn)化為一組二維片段的過程,然后傲宜,這些片段由片段著色器處理运杭。這些二維片段代表著可在屏幕上繪制的像素。
OpenGL ES 3.0 光柵化階段
逐片段操作
片段著色器之后函卒,下一個(gè)階段就是逐片段操作
辆憔。
OpenGL ES 數(shù)據(jù)存儲(chǔ)
android中的程序都是運(yùn)行在虛擬機(jī)
中的,而OpenGL
作為本地系統(tǒng)庫是運(yùn)行在硬件上的报嵌,虛擬機(jī)與OpenGL
數(shù)據(jù)傳輸?shù)姆绞接蓛煞N
- 第一種:使用Java調(diào)用本地接口
JNI
的方式虱咧,當(dāng)我們使用GLES20包
里的方法時(shí),內(nèi)部實(shí)現(xiàn)其實(shí)就是調(diào)用本地方法锚国。 - 第二種:改變內(nèi)存的分配方式腕巡,Java當(dāng)中有個(gè)特殊的類(如
ByteBuffer
)集合,可以直接分配本地內(nèi)存塊血筑,并把Java的數(shù)據(jù)復(fù)制到本地內(nèi)存绘沉,本地內(nèi)存可以被本地環(huán)境存取,而不受垃圾回收器管控豺总。
從虛擬機(jī)到本地環(huán)境的數(shù)據(jù)傳輸過程
項(xiàng)目地址:
https://github.com/byhook/opengles4android
參考:
《OpenGL ES 3.0 編程指南第2版》
《OpenGL ES應(yīng)用開發(fā)實(shí)踐指南Android卷》