博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenGL ES 2.0绘制方式
阅读量:6420 次
发布时间:2019-06-23

本文共 2787 字,大约阅读时间需要 9 分钟。

hot3.png

    今天我们将在OpenGL路上前进一步,了解一下其绘制方式。OpenGL ES 2.0能绘制的基本图元为:点、线和三角形,当然在OpenGL中能支持更多的图元,在此则不再赘述。我们将以绘制三角形的方式来详细讲解各种绘制方式。

    首先来了解一下有哪些绘制方式?(姑且把它们放在一起来说)

    1.画点:GL_POINTS。

    2.画线:GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP。

    3.画三角形:GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN。

    4.顶点法绘制:glDrawArrays。

    5.顶点索引法绘制:glDrawElements。

    下面我们通过绘制正方形来讲解图元三角形的绘制方式以及顶点法和顶点索引法绘制图形的方式。首先看一下三角形的三种绘制方式图解:

011408_X72h_1257439.png

                                                                                 图2.1

    1.GL_TRIANGLES方式:这种方式从下面可以很明显的看出有很多重复的点,所以效率不是很高,但是如今的设备应该能承受的住。但其优点十分明显,就是一看明了,画了多少个三角形。这种绘制方式容易理解。

    首先定义顶点数组并赋值:

//正方形边长public static float STEP = 0.8f; //顶点数组float[] mVertex1 = new float[]{//x,y,z   -STEP,STEP,0,  //0   -STEP,-STEP,0, //1   STEP,-STEP,0,  //2       -STEP,STEP,0, //3(0)   STEP,-STEP,0, //4(2)   STEP,STEP,0 //5(3)};//顶点数mCount1 = mVertex1.length/3;//顶点数组缓冲mVertexBuffer1 = BufferUtils.getFloatBuffer(mVertex1.length*4);mVertexBuffer1.put(mVertex1).position(0);

    然后使用顶点法来绘制图形:

//使用顶点法绘制GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, mCount1);

    定义顶点索引数组并赋值:OpenGL ES 2.0 只支持byte和short类型。索引其实就是按照一定方式给顶点编号,从0开始。

//顶点索引数组(一般顶点很多时候,用这种索引,方便,不会出错。)byte[] mIndex1 = new byte[mCount1];for(int i=0;i

    使用顶点索引法来绘制图形:

//使用顶点索引绘画,第三个参数type必须为GL_UNSIGNED_BYTE或者GL_UNSIGNED_SHORT。这也是上面定义索引类型的原因。GLES20.glDrawElements(GLES20.GL_TRIANGLES, mCount1, GLES20.GL_UNSIGNED_BYTE, mIndexBuffer1);

2.GL_TRIANGLE_STRIP方式:三角带方式,应该是效率最高的一种绘制方式,同一图形它定义的顶点数据最少。但当顶点数一多,人工难以确定顶点位置和顺序。

    首先定义顶点数组并赋值:

/**  * 如果当前顶点n是奇数:  * 组成三角形的顶点排列顺序:T = [n-1, n-2, n]  * 如果当前顶点n是偶数:  * 组成三角形的顶点排列顺序:T = [n-2,n-1,n]  * 绘画顺序为:0,1,2,  2,1,3  */float[] mVertex2 = new float[]{//x,y,z   -STEP,STEP,0, //0   -STEP,-STEP,0, //1   STEP,STEP,0, //2   STEP,-STEP,0 //3};mCount2 = mVertex2.length/3;mVertexBuffer2 = BufferUtils.getFloatBuffer(mVertex2.length*4);mVertexBuffer2.put(mVertex2).position(0);

    下面定义顶点索引数组并赋值:

//顶点索引数组byte[] mIndex2 = new byte[mCount2];for(int i=0;i

     使用顶点法来绘制:

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

    使用顶点索引法来绘制:

GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP, mCount2, GLES20.GL_UNSIGNED_BYTE,mIndexBuffer2);

3.GL_TRIANGLE_FAN方式:效率居中。

    首先定义顶点数组并赋值:

/**  * 0,1,2,  0,2,3,  0,3,4,  0,4,5(1)    */float[] mVertex3 = new float[]{//x,y,z   0,0,0, //0   -STEP,-STEP,0, //1   STEP,-STEP,0, //2   STEP,STEP,0, //3   -STEP,STEP,0, //4   -STEP,-STEP,0 //5(1)}; mCount3 = mVertex3.length/3;mVertexBuffer3 = BufferUtils.getFloatBuffer(mVertex3.length*4);mVertexBuffer3.put(mVertex3).position(0);

 定义顶点索引数组并赋值:

//顶点索引数组,采用的是GL_TRIANGLE_FAN方式来绘制。//  byte[] mIndex3 = new byte[mCount3];//  for(int i=0;i

 使用顶点法来绘制:

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

    使用顶点索引法来绘制:

GLES20.glDrawElements(GLES20.GL_TRIANGLE_FAN, mCount3, GLES20.GL_UNSIGNED_BYTE, mIndexBuffer3);

    请小伙伴们仔细体悟顶点数组里面所取顶点顺序,还要注意一点:使用同一的绘画顺序的,逆时针或者顺时针。

    本节到此结束。

    源码:

    下图为GL_TRIANGLES效果图:

213704_UV1p_1257439.png

参考资料:

  1. 讲解GL_TRIANGLE_STRIP:

 

转载于:https://my.oschina.net/u/1257439/blog/366154

你可能感兴趣的文章
CrazyWing:Python自动化运维开发实战 十三、Python文件I/O
查看>>
引导过程和服务控制
查看>>
Linux下网络相关属性配置
查看>>
分布式文件系统--MogileFS
查看>>
XP远程桌面连接Windows Server 2008 r2(网络级别身份验证NLA)
查看>>
4、【华为HCIE-Storage】--RAID性能指标及划分
查看>>
GDB常用命令
查看>>
U3D架构系列之- FSM有限状态机设计六(总结篇)
查看>>
关于php面向对象的一个坑爹的地方
查看>>
storm的搭建(单机版)
查看>>
Oracle 10g的卸载
查看>>
griedview setOnItemLongClickListener 无效
查看>>
pyqt在控件上创建图片
查看>>
邮件服务器被***根源及解决方案
查看>>
Linux IO实时监控iostat命令详解
查看>>
企业软件仓库部署及应用案例(基于CentOS 6的YUM源)
查看>>
探寻路径
查看>>
微访谈活动-企业微博2.0与数据微博营销(转)
查看>>
Android生命周期
查看>>
优酷土豆:财报不是问题!
查看>>