Android OpenGL ES 6.索引法繪制

前言

之前我們繪制的都是一些簡單的基礎(chǔ)圖形榴啸,本章節(jié)我們繪制一個復雜些的形狀,如下膳凝。

索引繪制

圖中的數(shù)字是后期標注碑隆,并非GL繪制。

根據(jù)之前學的知識蹬音,我們知道上煤,這個圖形可以分解為4個三角形,用數(shù)字代表頂點序號著淆,分別是

  • 0, 1, 2
  • 0, 2, 3
  • 0, 4, 1
  • 3, 2, 5

在程序中劫狠,每個頂點對應x、y坐標永部,那么我們的頂點數(shù)組數(shù)據(jù)就需要如下聲明:

private static final float[] POINT_DATA = {
    // 0, 1, 2
    -0.5f, -0.5f,
    0.5f, -0.5f,
    0.5f, 0.5f,
    // 0, 2, 3
    -0.5f, -0.5f,
    0.5f, 0.5f,
    -0.5f, 0.5f,
    // 0, 4, 1
    -0.5f, -0.5f,
    0f, -1.0f,
    0.5f, -0.5f,
    // 3, 2, 5
    -0.5f, 0.5f,
    0.5f, 0.5f,
    0f, 1.0f,
};

所以嘉熊,實際聲明的頂點數(shù)是4 * 3 = 12個頂點。而其中有很多頂點是可以重復的扬舒,這導致2個問題:

  1. 頂點數(shù)據(jù)過多阐肤,代碼的可讀性降低,需要隔幾行就注釋一下
  2. 有重復的頂點數(shù)據(jù)讲坎,造成了內(nèi)存的浪費

這種繪制方式孕惜,叫頂點法繪制。
而本章節(jié)會引入一個新的技巧:索引法繪制晨炕。


代碼實現(xiàn)

1. 定義坐標衫画、索引

/**
 * 頂點數(shù)據(jù)
 */
private static final float[] POINT_DATA = {
        -0.5f, -0.5f,
        0.5f, -0.5f,
        0.5f, 0.5f,
        -0.5f, 0.5f,
        0f, -1.0f,
        0f, 1.0f,
};

/**
 * 數(shù)組繪制的索引:當前是繪制三角形,所以是3個元素構(gòu)成一個繪制順序
 */
private static final short[] VERTEX_INDEX = {
        0, 1, 2,
        0, 2, 3,
        0, 4, 1,
        3, 2, 5};

這里第一個float類型的數(shù)組瓮栗,定義了每個頂點的坐標位置削罩。

第二個數(shù)組是short類型的,定義了上一個數(shù)組的繪制順序费奸。也就是0代表著POINT_DATA數(shù)組的第0組的數(shù)據(jù)(-0.5f, -0.5f)弥激。再解釋下,之后我們會聲明為2個點為一個頂點愿阐,所以索引0并非表示第0位的POINT_DATA[0]微服,而是第0組。

2. 繪制圖形

@Override
public void onDrawFrame(GL10 glUnused) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    // 1. 繪制模式缨历; 2. 從數(shù)組中讀取的數(shù)據(jù)長度以蕴; 3. 加載的數(shù)據(jù)格式; 4. 讀取的數(shù)據(jù)緩沖區(qū)
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, VERTEX_INDEX.length,
            GLES20.GL_UNSIGNED_SHORT, mVertexIndexBuffer);
}

這里使用到了一個新的方法GLES20.glDrawElements辛孵,方法參數(shù)分別是

  1. 圖形繪制方式
  2. 繪制的頂點數(shù)
  3. 索引的數(shù)據(jù)格式
  4. 索引的數(shù)據(jù)Buffer

這里再回顧下頂點法的繪制方法GLES20.glDrawArrays丛肮,方法參數(shù)分別是

  1. 圖形繪制方式
  2. 從頂點數(shù)據(jù)讀取數(shù)據(jù)的起點位置(以點作為單位,而非向量)
  3. 繪制的頂點數(shù)

3. 頂點法魄缚、索引法的比較

按照索引的數(shù)據(jù)聲明方式宝与,代碼的可讀性大大地提高,那么性能上有多大提升呢?
首先伴鳖,我們知道GL中,一個Float類型的數(shù)據(jù)占4個Byte徙硅,一個Short類型的占2個Byte榜聂。

那么在前言中聲明的12個頂點的方式,也就是頂點法繪制方式嗓蘑,占的內(nèi)存空間是:

12(頂點數(shù)) * 2(x须肆、y兩個向量為一組) * 4(Float格式占的Byte字節(jié)) = 96字節(jié)

而索引法的占的內(nèi)存空間是:

6(頂點數(shù)) * 2(x、y兩個向量為一組) * 4(Float格式占的Byte字節(jié)) + 12(索引數(shù)) * 2(Short格式占的Byte字節(jié)) = 48 + 24 = 72字節(jié)

本章節(jié)繪制的圖形頂點屬性比較單一桩皿,只有頂點位置豌汇,假若包含了顏色等其他頂點信息,那么頂點法占的內(nèi)存將更大泄隔。

歸納下兩種繪制方式的對比情況拒贱。

繪制方式 適用場景 可讀性 內(nèi)存計算方式
頂點法 頂點復用情況少 頂點數(shù) * 頂點屬性數(shù) * 頂點數(shù)據(jù)格式類型
索引法 頂點復用情況多 頂點數(shù) * 頂點屬性數(shù) * 頂點數(shù)據(jù)格式類型 + 索引數(shù) * 索引數(shù)據(jù)格式類型

參考

Android OpenGL ES學習資料所列舉的博客、資料佛嬉。

GitHub代碼工程

本系列課程所有相關(guān)代碼請參考我的GitHub項目GLStudio逻澳。

課程目錄

本系列課程目錄詳見 簡書 - Android OpenGL ES教程規(guī)劃

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市暖呕,隨后出現(xiàn)的幾起案子斜做,更是在濱河造成了極大的恐慌,老刑警劉巖湾揽,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓤逼,死亡現(xiàn)場離奇詭異,居然都是意外死亡库物,警方通過查閱死者的電腦和手機霸旗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戚揭,“玉大人定硝,你說我怎么就攤上這事『聊浚” “怎么了蔬啡?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镀虐。 經(jīng)常有香客問我箱蟆,道長,這世上最難降的妖魔是什么刮便? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任空猜,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辈毯。我一直安慰自己坝疼,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布谆沃。 她就那樣靜靜地躺著钝凶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕陷。 梳的紋絲不亂的頭發(fā)上哟沫,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天锌介,我揣著相機與錄音,去河邊找鬼裹虫。 笑死筑公,一個胖子當著我的面吹牛匣屡,可吹牛的內(nèi)容都是我干的捣作。 我是一名探鬼主播鹅士,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼也拜,長吁一口氣:“原來是場噩夢啊……” “哼慢哈!你這毒婦竟也來了卵贱?” 一聲冷哼從身側(cè)響起键俱,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤缀辩,失蹤者是張志新(化名)和其女友劉穎雌澄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魁莉,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屎媳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烛谊。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖双泪,靈堂內(nèi)的尸體忽然破棺而出攒读,到底是詐尸還是另有隱情剪返,我是刑警寧澤脱盲,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站面哥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吱涉。R本人自食惡果不足惜怎爵,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一墩莫、第九天 我趴在偏房一處隱蔽的房頂上張望题山。 院中可真熱鬧,春花似錦故痊、人聲如沸顶瞳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戴甩。三九已至协饲,卻和暖如春描馅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工烤黍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留知市,地道東北人傻盟。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓速蕊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诽表。 傳聞我的和親對象是個殘疾皇子唉锌,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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