Android OpenGL ES(七)基本几何图形定义 .

摘要:
在前面AndroidOpenGLES(六):创建实例应用OpenGLDemos程序框架我们创建了示例程序的基本框架,并提供了一个“HelloWorld”示例,将屏幕显示为红色。本例介绍OpenGLES3D图形库支持的几种基本几何图形,通常二维图形库可以绘制点,线,多边形,圆弧,路径等等。OpenGLES支持绘制的基本几何图形分为三类:点,线段,三角形。也就是说OpenGLES只能绘制这三种基本几何图形。这些对一组顶点的不同解释就定义了AndroidOpenGLES可以绘制的基本几何图形,下面定义了OpenGLES定义的几种模式:GL_POINTS绘制独立的点。

在前面Android OpenGL ES(六):创建实例应用OpenGLDemos程序框架我们创建了示例程序的基本框架,并提供了一个“Hello World”示例,将屏幕显示为红色。

本例介绍OpenGL ES 3D图形库支持的几种基本几何图形,通常二维图形库可以绘制点,线,多边形,圆弧,路径等等。OpenGL ES 支持绘制的基本几何图形分为三类:点,线段,三角形。也就是说OpenGL ES 只能绘制这三种基本几何图形。任何复杂的2D或是3D图形都是通过这三种几何图形构造而成的。

比如下图复杂的3D图形,都有将其分割成细小的三角形面而构成的。然后通过上色(Color),添加材质(Texture),再添加光照(lighting),构造3D效果的图形:

Android OpenGL ES(七)基本几何图形定义 .第1张

点,线段,三角形都是通过顶点来定义的,也就是顶点数组来定义。对应平面上的一系列顶点,可以看出一个个孤立的点(Point),也可以两个两个连接成线段(Line Segment) ,也可以三个三个连成三角形(Triangle)。这些对一组顶点的不同解释就定义了Android OpenGL ES可以绘制的基本几何图形,下面定义了OpenGL ES定义的几种模式:

GL_POINTS

绘制独立的点。

Android OpenGL ES(七)基本几何图形定义 .第2张

GL_LINE_STRIP

绘制一系列线段。

Android OpenGL ES(七)基本几何图形定义 .第3张

GL_LINE_LOOP

类同上,但是首尾相连,构成一个封闭曲线。

Android OpenGL ES(七)基本几何图形定义 .第4张

GL_LINES

顶点两两连接,为多条线段构成。

Android OpenGL ES(七)基本几何图形定义 .第5张

GL_TRIANGLES

每隔三个顶点构成一个三角形,为多个三角形组成。

Android OpenGL ES(七)基本几何图形定义 .第6张

GL_TRIANGLE_STRIP

每相邻三个顶点组成一个三角形,为一系列相接三角形构成。

Android OpenGL ES(七)基本几何图形定义 .第7张

GL_TRIANGLE_FAN

以一个点为三角形公共顶点,组成一系列相邻的三角形。

Android OpenGL ES(七)基本几何图形定义 .第8张

以上模式对应到Android渲染方法:

OpenGL ES提供了两类方法来绘制一个空间几何图形:

  • public abstract voidglDrawArrays(int mode, int first, int count) 使用VetexBuffer 来绘制,顶点的顺序由vertexBuffer中的顺序指定。
  • public abstract voidglDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由indices Buffer 指定。

其中mode 为上述解释顶点的模式。

前面说过顶点一般使用数组来定义,并使用Buffer来存储以提高绘图性能

如下面定义三个顶点坐标,并把它们存放在FloatBuffer 中:

float[] vertexArray = new float[]{
 -0.8f , -0.4f * 1.732f , 0.0f,
 0.8f , -0.4f * 1.732f , 0.0f,
 0.0f , 0.4f * 1.732f , 0.0f,
 };
ByteBuffer vbb
 = ByteBuffer.allocateDirect(vertexArray.length*4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer vertex =vbb.asFloatBuffer();
vertex.put(vertexArray);
vertex.position(0);

有了顶点的定义,下面就可以通过打开Android OpenGL ES(二):OpenGL ES管道(Pipeline)的相应开关将顶点参数传给OpenGL 库:

打开顶点开关和关闭顶点开关的方法如下:

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
...
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

在打开顶点开关后,将顶点坐标传给OpenGL 管道的方法为:glVertexPointer:

public void glVertexPointer(int size,int type,int stride,Buffer pointer)

  • size: 每个顶点坐标维数,可以为2,3,4。
  • type: 顶点的数据类型,可以为GL_BYTE, GL_SHORT, GL_FIXED,或 GL_FLOAT,缺省为浮点类型GL_FLOAT。
  • stride: 每个相邻顶点之间在数组中的间隔(字节数),缺省为0,表示顶点存储之间无间隔。
  • pointer: 存储顶点的数组。

应用用上可以般顶点的颜色值存放在对应顶点后面,如下图,RGB 采用4 字节表示,此时相邻顶点就不是连续存放的,stride 值为4

Android OpenGL ES(七)基本几何图形定义 .第9张

对应顶点除了可以为其定义坐标外,还可以指定颜色,材质,法线(用于光照处理)等。

glEnableClientState 和 glDisableClientState 可以控制的pipeline开关可以有:GL_COLOR_ARRAY (颜色) ,GL_NORMAL_ARRAY (法线), GL_TEXTURE_COORD_ARRAY (材质), GL_VERTEX_ARRAY(顶点), GL_POINT_SIZE_ARRAY_OES等。

对应的传入颜色,顶点,材质,法线的方法如下:

glColorPointer(int size,int type,intstride,Buffer pointer)
glVertexPointer(int size, int type, intstride, Buffer pointer)
glTexCoordPointer(int size, int type, intstride, Buffer pointer)
glNormalPointer(int type, int stride, Buffer pointer)

如果需要使用三角形来构造复杂图形,可以使用GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN模式,另外一种是通过定义顶点序列:

如下图定义了一个正方形:

Android OpenGL ES(七)基本几何图形定义 .第10张

对应的顶点和buffer 定义代码:

private short[] indices = { 0, 1, 2, 0, 2, 3};
//To gain some performance we also put this ones in a byte buffer.
//short is 2 bytes, therefore we multiply the number if vertices with 2.
ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
ibb.order(ByteOrder.nativeOrder());
ShortBuffer indexBuffer =ibb.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);

定义三角形的顶点的顺序很重要在拼接曲面的时候,用来定义面的顶点的顺序非常重要,因为顶点的顺序定义了面的朝向(前向或是后向),为了获取绘制的高性能,一般情况不会绘制面的前面和后面,只绘制面的“前面”。虽然“前面”“后面”的定义可以应人而易,但一般为所有的“前面”定义统一的顶点顺序(顺时针或是逆时针方向)。

下面代码设置逆时针方法为面的“前面”:

gl.glFrontFace(GL10.GL_CCW);

打开 忽略“后面”设置:

gl.glEnable(GL10.GL_CULL_FACE);


明确指明“忽略“哪个面的代码如下:

gl.glCullFace(GL10.GL_BACK);  

免责声明:文章转载自《Android OpenGL ES(七)基本几何图形定义 .》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php中_initialize()函数与 __construct()函数的区别说明想高效学会Hadoop,你要按照这个路线下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[osg][opengl]透视投影的参数Perspective

gluPerspective这个函数指定了观察的视景体(frustum为锥台的意思,通常译为视景体)在世界坐标系中的具体大小,一般而言,其中的参数aspect应该与窗口的宽高比大小相同。比如说,aspect=2.0表示在观察者的角度中物体的宽度是高度的两倍,在视口中宽度也是高度的两倍,这样显示出的物体才不会被扭曲。 gluPerspective NAME...

WebGL的第二个小程序

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <...

Android平台下OpenGL初步使用

本文只关注于如何一步步实现在Android平台下运用OpenGl。 1、GLSurfaceView GLSurfaceView是Android应用程序中实现OpenGl画图的重要组成部分。GLSurfaceView中封装了一个Surface。而android平台下关于图像的现实,差不多都是由Surface来实现的。 2、Renderer 有了GLSurfa...

深入剖析 RocketMQ 源码 消息存储模块

一、简介 RocketMQ 是阿里巴巴开源的分布式消息中间件,它借鉴了 Kafka 实现,支持消息订阅与发布、顺序消息、事务消息、定时消息、消息回溯、死信队列等功能。RocketMQ 架构上主要分为四部分,如下图所示: Producer:消息生产者,支持分布式集群方式部署。 Consumer:消息消费者,支持分布式集群方式部署。 NameServer:...

ORB-SLAM3 单目地图初始化(终结篇)

作者: 乔不思 来源:微信公众号|3D视觉工坊(系投稿) 3D视觉精品文章汇总:https://github.com/qxiaofan/awesome-3D-Vision-Papers/ 一、前言 请阅读本文之前最好把ORB-SLAM3的单目初始化过程再过一遍(ORB-SLAM3 细读单目初始化过程(上)、超详细解读ORB-SLAM3单目初始化(下篇)),...

Geometry shader总结

什么是Geometry Shader GS存在于vertext shader和固定功能vertex post-processing stage之间,它是可选的不是必要的。GS的输入是单个primitive,输出可能是0个或多个primitive.  GS的作用 GS的主要作用就是从已有的primitive中生成新的primitive,它可以“无中生有”的...