Opengles 绘制方式(点,线,三角形)

Android 三种绘制形式

前言:大家都知道,Android Opengles的基本图元有点,线,三角形,任何复杂的图形都能用这个三个图元构成,其中点的就只需要知道其坐标值就可以绘制了,而线和三角形的绘制形式是有多种的。wtf,有人会想着说的是什么意思,线不就是两个点的连线吗?这种说法没错,但这是绘制线的一种表现形式,三角形也是类似的

一.点的绘制方式

在前两篇讲解三角形绘制的时候,大家肯定注意到了这一样代码:

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

这是绘制三角形的一种形式,如果是绘制点改成

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

绘制点的简单,就不过多的说明了.

二.线的绘制方式

首先贴张图来展现一下opengl线的绘制是哪三种形态:

从图上可以直观的展现出来:

  1. GL_LINES:是将传入的顶点,依次两两配对组成线段进行绘制,若顶点数为奇数,则将最后一个给忽略掉。
  2. GL_LINE_STRIP:是将传入的顶点,进行依次的连接绘制
  3. GL_LINE_LOOP:是将传入的顶点,进行依次的连接绘制,最后将头尾顶点进行连接,形成一个闭环。

NO Code No BB 下面从代码层面上进行着三种形式的展示:
在前两章讲解画三角形的上面做一些修改就可以画直线了.
在方法 :

initVertexData()

中,先对顶点顶点坐标进行一个修改,因为要画两条直线,所以需要4个顶点即12个值.

vCount = 4; //因为是4个顶点
float vertices[] = new float[]
{
    -4 * UNIT_SIZE, 0,
    0, 0, -4 * UNIT_SIZE, 0,
    4 * UNIT_SIZE, 0, 0,
    0, 4 * UNIT_SIZE, 0
};

在修改顶点颜色的值(这步可以不做,因为背景是黑色的,换成白色的清楚一点):

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

以上效果图验证了直线的绘制方式。

三角形的绘制方式

首先贴张图来展现一下opengl三角形的绘制是哪三种形态:



截图来至于:《android游戏开发宝典》

  • GL_TRIANGLE:其实绘制三角形类型之一。它是直接用三个顶点来表示一个三角形,这句话的意思就是假设你绘制3个三角形,有两个三角形的顶点是重合的,还是分别要对重合顶点声明,在顶点数组中会有12个顶点,其中有两三个顶点的数据是重复的,但这是必须的,因为每个三角形的顶点都必须单独的声明。
  • GL_TRIANGLE_STRIP:绘制三角形带,在绘制过程中前一个三角形的后两个顶点,会被后一个三角形引用,然后串联起来形成三角形带。若有N个顶点,则绘制出的三角形有N-2个
  • GL_TRIANGLE_FAN:以第一个点为中心点,其它顶点作为边缘点绘制出组成扇型的相邻三角形

NO Code No BB 下面从代码层面上进行着三种形式的展示:

在前两章讲解画三角形的上面做一些修改就可以画三角形了.

  1. GL_TRIANGLE的绘制

    首先是修改顶点数据将

initVertexData()
中的顶点数据修改为:
float vertices[] = new float[]{
    //第一个triangle
    -4*UNIT_SIZE,0,0,
    0,-4*UNIT_SIZE,0,
    0,0,0,
    //第二个triangle
    0,-4*UNIT_SIZE,0,
    0,0,0,
    4*UNIT_SIZE,-4*UNIT_SIZE,0,
    //第三个triangle
    0,0,0,
    4*UNIT_SIZE,-4*UNIT_SIZE,0,
    4*UNIT_SIZE,4*UNIT_SIZE,0
    };

从上面可以看出,虽然有些顶点是重复的,但GL_TRIANGLE画三角形是各画各的,顶点数据之间不会复用的。
再将各个顶点的颜色给修改了

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,
    };

因为有9个顶点,从颜色可以看出只有三种颜色即白,红,绿。

最后将绘制模式给更改为:

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

最后的效果图为:

TRIANGLE.png
  1. GL_TRIANGLE_STRIP的绘制

在绘制GL_TRIANGLE_STRIP的时候,需要注意每个三角形顶点的绘制顺序是有一定规律的如下:

其规律是:
构建当前三角形的顶点的连接顺序依赖于要和前面已经出现过的2个顶点组成三角形的当前顶点的序号的奇偶性(如果从0开始):
如果当前顶点是奇数:
组成三角形的顶点排列顺序:T = [n-1 n-2 n].
如果当前顶点是偶数:
组成三角形的顶点排列顺序:T = [n-2 n-21 n].
以上图为例,第一个三角形,顶点v2序号是2,是偶数,则顶点排列顺序是v0,v1,v2。第二个三角形,顶点v3序号是3,是奇数,则顶点排列顺序是v2,v1,v3,第三个三角形,顶点v4序号是4,是偶数,则顶点排列顺序是v2,v3,v4,以此类推。

首先因为顶点可以复用,所以将

initVertexData()

vCount=5 ,这个vCount千万不能写错,不然可能会出现一些莫名其妙的区域
是画三个三角形形成的带,所以需要5个顶点.

再将顶点数据修改为:

/*TRIANGLE_STRIP*/
float vertices[] = new float[]{
    //第一个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,
    };

每个顶点对应的颜色是:

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的绘制
    这个没什么可将的,直接上代码:
initVertexData()//方法中
vCount = 5;

修改顶点数据:

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[]{
    //第一个triangle
    0, 0, 0,
    4 * UNIT_SIZE, 0, 0,
    v2x, v2y, 0,
    v3x, v3y, 0,
    0, 4 * UNIT_SIZE, 0
    };

颜色数据

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

三角形的绘制就介绍完毕了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容