andorid之OpenGL基本原理

在OpenGL中对3D空间进行绘制首先要指定一系列的点,这些点也成为是顶点,每个点都具有三个值,分别对应了x,y,z轴上的坐标。然后把点连接成为各种形状,在OpenGL ES中这些点连接成的形状被称作是原始形状,包括点,线和三角形。在OpenGL中还包括矩形和多边形。

OpenGL ES提供了两个主要的方法绘制图形:1,glVertexPointer      2,glDrawableElements

glVertexPointer 方法指定由要绘制的点组成是数组,每个点将包含3个值:x,y,z。比如一个三角形的顶点坐标就可以定义如下:

float[] coords = {

                           -0.5f,0.5f,0,

                           0.5f,-0.5f,0,

                          -0.5f,0.5f,0,};

要绘制这些点就要通过glVertexPointer方法将他们传递给OpenGL ES。为了提高效率glVertexPointer仅接受与语言无关的本地缓冲区而不是java数组,因此就需要使用java.nio包中的类将java数组转化成glVertexPointer可接受的类似于C的本地缓冲区,示例如下:

java.nio.ByteBuffer vbb = java.nio.ByteBuffer.allocateDirect(3*3*4);
vbb.order(ByteOrder.nativeOrder());
java.nio.FloatBuffer vertexBuffer = vbb.asFloatBuffer();

字节码缓冲区是转换为字节的内存缓冲区,每个点有三个浮点值,因为他们有三个坐标轴,每个浮点值是占四个字节,所以每个点需要3*4个字节,一个三角形有三个点所以要3*3*4个字节的缓冲区。

现在就要把java数组填充到刚建立的缓冲区中去,示例如下:

for(int i=0;i<coords.length;i++){
         vertexBuffer.put(coords[i]);
}

这些值填充到缓冲区后就可以调用 glVertexPointer方法了,

GLES10.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

第一个参数是点的维数,3标示3维代表xyz,2标示2维表示xy,这时z是0;

第二个参数是点的坐标的数值的类型

第三个参数是点与点之间分开的字节数,0表示一个点紧挨着一个点

第四个参数是包含点的缓冲区的指针

glDrawableElements方法是用来绘制glVertexPointer指定的一系列的点,这里要注意的是OpenGL是一种状态机,它在以累计方式调用下一个方法时,会记住一个方法所设置的值,所以无序显示的将glVertexPointer设置的值的点传递给glDrawableElements,glDrawableElements将隐式的使用这些点。

GLES10.glDrawElements(GL10.GL_TRIANGLE_STRIP, 3, GL10.GL_UNSIGNED_SHORT,indexBuffer);

第一个参数标示的是要绘制的几何图形:GL_TRIANGLE_STRIP标示三角形条带、GL_TRIANGLES仅绘制三角形、GL_TRIANGLE_FAN三角扇形、GL_POINTS仅绘制点、GL_LINES仅绘制线、GL_LINE_STRIP线带、GL_LINE_LOOP线环,各个图形的大致形状如下:

 

 STRIP的概念在于使用旧点的时候添加新的点,这样可以避免为每个新的对象指定所有的点。FAN的概念是一个三角形的顶点作为所有三角形的顶点,绘制的图形是类似于扇形或圆形的对象。这些概念赋予了glDrawElements方法重用一些点的能力,当要使用重用这些点的时候要指定重用的点和新生的点,这个过程称作是为点缓冲区创建索引,这个索引值就是glDrawElements方法的第二个参数,比如上面要画一个三角形就要用到三个点的索引{0,1,2}这些值分别是顶点数组的下标,如果要画一个矩形就要用到四个点,第一个,第二个和第三个点形成第一个三角形,第二个点,第三个点和第四个点形成第二个三角形,这两个三角形形成了矩形,那么建立索引的时候就是{0,1,2,1,2,3}这时这个索引值就是这个索引数组的长度6,

第三个参数索引数组的值类型

第四个参数是索引缓冲区的引用

 

 OpenGL ES还有两个常用的方法:glClear和glColor

glClear方法擦除绘图表面颜色,使用这个方法根据参数的不同可以重置颜色和使用的蜡纸(stencil)的深度和类型,三者对应的参数分别是GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT,GL_STENCIL_BUFFER_BIT。

颜色缓冲区包括了可见的像素,深度缓冲区是指在3D场景中可见的像素,这要取决于对象的远近程度,蜡纸缓冲区可用于根据一些动态条件创建视觉效果,

glColor方法用来设置要绘制的图形的颜色,比如:glColor4f(1.0f,1.0f,1.0f,1.0f),方法名中的4f表示该方法接受四个浮点值参数,这四个浮点值是红绿蓝和alpha的分量。

 

在OpenGL中方法的命名全部用gl开头,之后是方法名。方法名后是一个可选的数字,这个数字表示维度的数量或者是参数的个数,数字后面是参数的类型。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值