Opengles 繪制方式(點(diǎn)挠羔,線,三角形)

Android 三種繪制形式

前言:大家都知道埋嵌,Android Opengles的基本圖元有點(diǎn)破加,線,三角形雹嗦,任何復(fù)雜的圖形都能用這個(gè)三個(gè)圖元構(gòu)成范舀,其中點(diǎn)的就只需要知道其坐標(biāo)值就可以繪制了,而線和三角形的繪制形式是有多種的了罪。wtf,有人會(huì)想著說的是什么意思尿背,線不就是兩個(gè)點(diǎn)的連線嗎?這種說法沒錯(cuò)捶惜,但這是繪制線的一種表現(xiàn)形式田藐,三角形也是類似的

一.點(diǎn)的繪制方式

在前兩篇講解三角形繪制的時(shí)候,大家肯定注意到了這一樣代碼:

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount); 

這是繪制三角形的一種形式吱七,如果是繪制點(diǎn)改成

GLES20.glDrawArrays(GLES20.GL_POINTS, 0, vCount);

繪制點(diǎn)的簡(jiǎn)單汽久,就不過多的說明了.

二.線的繪制方式

首先貼張圖來展現(xiàn)一下opengl線的繪制是哪三種形態(tài):

從圖上可以直觀的展現(xiàn)出來:

  1. GL_LINES:是將傳入的頂點(diǎn),依次兩兩配對(duì)組成線段進(jìn)行繪制踊餐,若頂點(diǎn)數(shù)為奇數(shù)景醇,則將最后一個(gè)給忽略掉。
  2. GL_LINE_STRIP:是將傳入的頂點(diǎn)吝岭,進(jìn)行依次的連接繪制
  3. GL_LINE_LOOP:是將傳入的頂點(diǎn)三痰,進(jìn)行依次的連接繪制,最后將頭尾頂點(diǎn)進(jìn)行連接窜管,形成一個(gè)閉環(huán)散劫。

NO Code No BB 下面從代碼層面上進(jìn)行著三種形式的展示:
在前兩章講解畫三角形的上面做一些修改就可以畫直線了.
在方法 :

initVertexData()

中,先對(duì)頂點(diǎn)頂點(diǎn)坐標(biāo)進(jìn)行一個(gè)修改幕帆,因?yàn)橐媰蓷l直線获搏,所以需要4個(gè)頂點(diǎn)即12個(gè)值.

vCount = 4; //因?yàn)槭?個(gè)頂點(diǎn)
float vertices[] = new float[]
{
    -4 * UNIT_SIZE, 0,
    0, 0, -4 * UNIT_SIZE, 0,
    4 * UNIT_SIZE, 0, 0,
    0, 4 * UNIT_SIZE, 0
};

在修改頂點(diǎn)顏色的值(這步可以不做,因?yàn)楸尘笆呛谏氖瑩Q成白色的清楚一點(diǎn)):

float colors[] = new float[]
{
    1, 1, 1, 0,
    1, 1, 1, 0,
    1, 1, 1, 0,
    1, 1, 1, 0
};

最后一步將

drawSelf()

中的繪制圖元替換掉就可以了,改成

GLES20.glDrawArrays(GLES20.GL_LINES, 0, vCount);

效果圖如下:

lines.png

直線的第二種繪制方式:

GLES20.glDrawArrays(GLES20.GL_LINE_STRIP, 0, vCount);

效果圖如下:

lines_strip.png

直線的第三種繪制方式:

GLES20.glDrawArrays(GLES20.GL_LINE_STRIP, 0, vCount);    

效果圖如下:

lines_loop.png

以上效果圖驗(yàn)證了直線的繪制方式常熙。

三角形的繪制方式

首先貼張圖來展現(xiàn)一下opengl三角形的繪制是哪三種形態(tài):



截圖來至于:《android游戲開發(fā)寶典》

  • GL_TRIANGLE:其實(shí)繪制三角形類型之一纬乍。它是直接用三個(gè)頂點(diǎn)來表示一個(gè)三角形,這句話的意思就是假設(shè)你繪制3個(gè)三角形裸卫,有兩個(gè)三角形的頂點(diǎn)是重合的仿贬,還是分別要對(duì)重合頂點(diǎn)聲明,在頂點(diǎn)數(shù)組中會(huì)有12個(gè)頂點(diǎn)墓贿,其中有兩三個(gè)頂點(diǎn)的數(shù)據(jù)是重復(fù)的茧泪,但這是必須的,因?yàn)槊總€(gè)三角形的頂點(diǎn)都必須單獨(dú)的聲明募壕。
  • GL_TRIANGLE_STRIP:繪制三角形帶调炬,在繪制過程中前一個(gè)三角形的后兩個(gè)頂點(diǎn)语盈,會(huì)被后一個(gè)三角形引用舱馅,然后串聯(lián)起來形成三角形帶。若有N個(gè)頂點(diǎn)刀荒,則繪制出的三角形有N-2個(gè)
  • GL_TRIANGLE_FAN:以第一個(gè)點(diǎn)為中心點(diǎn)代嗤,其它頂點(diǎn)作為邊緣點(diǎn)繪制出組成扇型的相鄰三角形

NO Code No BB 下面從代碼層面上進(jìn)行著三種形式的展示:

在前兩章講解畫三角形的上面做一些修改就可以畫三角形了.

  1. GL_TRIANGLE的繪制

    首先是修改頂點(diǎn)數(shù)據(jù)將

initVertexData()
中的頂點(diǎn)數(shù)據(jù)修改為:
float vertices[] = new float[]{
    //第一個(gè)triangle
    -4*UNIT_SIZE,0,0,
    0,-4*UNIT_SIZE,0,
    0,0,0,
    //第二個(gè)triangle
    0,-4*UNIT_SIZE,0,
    0,0,0,
    4*UNIT_SIZE,-4*UNIT_SIZE,0,
    //第三個(gè)triangle
    0,0,0,
    4*UNIT_SIZE,-4*UNIT_SIZE,0,
    4*UNIT_SIZE,4*UNIT_SIZE,0
    };

從上面可以看出,雖然有些頂點(diǎn)是重復(fù)的缠借,但GL_TRIANGLE畫三角形是各畫各的干毅,頂點(diǎn)數(shù)據(jù)之間不會(huì)復(fù)用的。
再將各個(gè)頂點(diǎn)的顏色給修改了

float colors[] = new float[]
    {
            1, 1, 1, 0,
        1, 1, 1, 0,
        1, 1, 1, 0,
        1, 0, 0, 0,
        1, 0, 0, 0,
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 1, 0, 0,
        0, 1, 0, 0,
    };

因?yàn)橛?個(gè)頂點(diǎn)泼返,從顏色可以看出只有三種顏色即白硝逢,紅,綠绅喉。

最后將繪制模式給更改為:

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount);

最后的效果圖為:

TRIANGLE.png
  1. GL_TRIANGLE_STRIP的繪制

在繪制GL_TRIANGLE_STRIP的時(shí)候渠鸽,需要注意每個(gè)三角形頂點(diǎn)的繪制順序是有一定規(guī)律的如下:

其規(guī)律是:
構(gòu)建當(dāng)前三角形的頂點(diǎn)的連接順序依賴于要和前面已經(jīng)出現(xiàn)過的2個(gè)頂點(diǎn)組成三角形的當(dāng)前頂點(diǎn)的序號(hào)的奇偶性(如果從0開始):
如果當(dāng)前頂點(diǎn)是奇數(shù):
組成三角形的頂點(diǎn)排列順序:T = [n-1 n-2 n].
如果當(dāng)前頂點(diǎn)是偶數(shù):
組成三角形的頂點(diǎn)排列順序:T = [n-2 n-21 n].
以上圖為例,第一個(gè)三角形柴罐,頂點(diǎn)v2序號(hào)是2徽缚,是偶數(shù),則頂點(diǎn)排列順序是v0,v1,v2革屠。第二個(gè)三角形凿试,頂點(diǎn)v3序號(hào)是3,是奇數(shù)似芝,則頂點(diǎn)排列順序是v2,v1,v3,第三個(gè)三角形那婉,頂點(diǎn)v4序號(hào)是4,是偶數(shù)党瓮,則頂點(diǎn)排列順序是v2,v3,v4,以此類推吧恃。

首先因?yàn)轫旤c(diǎn)可以復(fù)用,所以將

initVertexData()

vCount=5 ,這個(gè)vCount千萬不能寫錯(cuò)麻诀,不然可能會(huì)出現(xiàn)一些莫名其妙的區(qū)域
是畫三個(gè)三角形形成的帶痕寓,所以需要5個(gè)頂點(diǎn).

再將頂點(diǎn)數(shù)據(jù)修改為:

/*TRIANGLE_STRIP*/
float vertices[] = new float[]{
    //第一個(gè)triangle
    -4 * UNIT_SIZE, 0, 0,
    0, 4 * UNIT_SIZE, 0,
    0, 0, 0,
    4 * UNIT_SIZE, -4 * UNIT_SIZE, 0,
    //0, -4 * UNIT_SIZE, 0,
    4 * UNIT_SIZE, 4 * UNIT_SIZE, 0,
    };

每個(gè)頂點(diǎn)對(duì)應(yīng)的顏色是:

float colors[] = new float[]
{
    1, 1, 1, 0,
    1, 0, 0, 0,
    0, 1, 0, 0,
    1, 1, 0, 0,
    0, 0, 1, 0,
};

最后修改三角形的繪制方式:

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, vCount);

最后的效果圖為:

TRIANGLE_SREIP.png
  1. GL_TRIANGLE_FAN的繪制
    這個(gè)沒什么可將的傲醉,直接上代碼:
initVertexData()//方法中
vCount = 5;

修改頂點(diǎn)數(shù)據(jù):

float v2x = (float) (4 * UNIT_SIZE * (Math.cos(Math.PI/6)));
float v2y = (float) (4 * UNIT_SIZE * (Math.sin(Math.PI/6)));
float v3x = (float) (4 * UNIT_SIZE * (Math.cos(Math.PI/3)));
float v3y = (float) (4 * UNIT_SIZE * (Math.sin(Math.PI/3)));
/*TRIANGLE_FAN*/
    float vertices[] = new float[]{
    //第一個(gè)triangle
    0, 0, 0,
    4 * UNIT_SIZE, 0, 0,
    v2x, v2y, 0,
    v3x, v3y, 0,
    0, 4 * UNIT_SIZE, 0
    };

顏色數(shù)據(jù)

float colors[] = new float[]
{
    1, 1, 1, 0,
    1, 0, 0, 0,
    0, 1, 0, 0,
    1, 1, 0, 0,
    0, 0, 1, 0,
};

最后修改繪制模式為:

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, vCount);

最后的效果圖為:

TRIANGLE_FAN.png

三角形的繪制就介紹完畢了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呻率,隨后出現(xiàn)的幾起案子硬毕,更是在濱河造成了極大的恐慌,老刑警劉巖礼仗,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吐咳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡元践,警方通過查閱死者的電腦和手機(jī)韭脊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來单旁,“玉大人沪羔,你說我怎么就攤上這事∠蠡耄” “怎么了蔫饰?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)愉豺。 經(jīng)常有香客問我篓吁,道長(zhǎng),這世上最難降的妖魔是什么蚪拦? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任杖剪,我火速辦了婚禮,結(jié)果婚禮上驰贷,老公的妹妹穿的比我還像新娘盛嘿。我一直安慰自己,他們只是感情好饱苟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布孩擂。 她就那樣靜靜地躺著,像睡著了一般箱熬。 火紅的嫁衣襯著肌膚如雪类垦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天城须,我揣著相機(jī)與錄音蚤认,去河邊找鬼。 笑死糕伐,一個(gè)胖子當(dāng)著我的面吹牛砰琢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼陪汽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼训唱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挚冤,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤况增,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后训挡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澳骤,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年澜薄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了为肮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肤京,死狀恐怖颊艳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蟆沫,我是刑警寧澤籽暇,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布温治,位于F島的核電站饭庞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏熬荆。R本人自食惡果不足惜舟山,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卤恳。 院中可真熱鬧累盗,春花似錦、人聲如沸突琳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拆融。三九已至蠢琳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镜豹,已是汗流浹背傲须。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趟脂,地道東北人泰讽。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親已卸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佛玄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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