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);

效果图如下:

Opengles 绘制方式(点,线,三角形)_第1张图片
lines.png

直线的第二种绘制方式:

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

效果图如下:

Opengles 绘制方式(点,线,三角形)_第2张图片
lines_strip.png

直线的第三种绘制方式:

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

效果图如下:

Opengles 绘制方式(点,线,三角形)_第3张图片
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);

最后的效果图为:

Opengles 绘制方式(点,线,三角形)_第4张图片
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);

最后的效果图为:

Opengles 绘制方式(点,线,三角形)_第5张图片
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);

最后的效果图为:

Opengles 绘制方式(点,线,三角形)_第6张图片
TRIANGLE_FAN.png

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

你可能感兴趣的:(Opengles 绘制方式(点,线,三角形))