android平臺(tái)下OpenGL ES 3.0從零開始

OpenGL ES 3.0學(xué)習(xí)實(shí)踐

目錄

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圖形管線圖

image

頂點(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)著色器的輸入輸出模型

image

頂點(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)一變量類型傀缩。
image

圖元裝配

圖元裝配頂點(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 光柵化階段

image

逐片段操作

片段著色器之后函卒,下一個(gè)階段就是逐片段操作辆憔。

image

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ù)傳輸過程

image

項(xiàng)目地址:
https://github.com/byhook/opengles4android

參考:
《OpenGL ES 3.0 編程指南第2版》
《OpenGL ES應(yīng)用開發(fā)實(shí)踐指南Android卷》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末车伞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子喻喳,更是在濱河造成了極大的恐慌另玖,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沸枯,死亡現(xiàn)場離奇詭異,居然都是意外死亡赂弓,警方通過查閱死者的電腦和手機(jī)绑榴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盈魁,“玉大人翔怎,你說我怎么就攤上這事。” “怎么了赤套?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵飘痛,是天一觀的道長。 經(jīng)常有香客問我容握,道長宣脉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任剔氏,我火速辦了婚禮塑猖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谈跛。我一直安慰自己羊苟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布感憾。 她就那樣靜靜地躺著蜡励,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阻桅。 梳的紋絲不亂的頭發(fā)上凉倚,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音鳍刷,去河邊找鬼占遥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛输瓜,可吹牛的內(nèi)容都是我干的瓦胎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尤揣,長吁一口氣:“原來是場噩夢啊……” “哼搔啊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起北戏,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤负芋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嗜愈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旧蛾,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年蠕嫁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锨天。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剃毒,死狀恐怖病袄,靈堂內(nèi)的尸體忽然破棺而出搂赋,到底是詐尸還是另有隱情,我是刑警寧澤益缠,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布脑奠,位于F島的核電站,受9級特大地震影響幅慌,放射性物質(zhì)發(fā)生泄漏宋欺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一欠痴、第九天 我趴在偏房一處隱蔽的房頂上張望迄靠。 院中可真熱鬧,春花似錦喇辽、人聲如沸掌挚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吠式。三九已至,卻和暖如春抽米,著一層夾襖步出監(jiān)牢的瞬間特占,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工云茸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留是目,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓标捺,卻偏偏與公主長得像懊纳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子亡容,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容