OpenGL ES之GLSurfaceView学习四:Android Demo里的Cube分析

关于android中Cube的绘制,可以看出一个3D图像的绘制机制。本文分析了Cube对象。

 

需要用到两张图片:第一张是立方体顶点顺序和位置图,第二张是三角面示例图。

立方体顶点图

 

 

三角面示例图

 

 

[java]  view plain copy
  1. package com.example.android.apis.graphics;  
  2. import java.nio.ByteBuffer;  
  3. import java.nio.ByteOrder;  
  4. import java.nio.IntBuffer;  
  5. import javax.microedition.khronos.opengles.GL10;  
  6. /** 
  7.  * A vertex shaded cube. 
  8.  */  
  9. class Cube  
  10. {  
  11.     public Cube()  
  12.     {  
  13.         int one = 0x10000;  
  14.           
  15.         //每一个顶点都是由x/y/z三个坐标表示的。对于一个立方体,有八个顶点。  
  16.         //每个顶点的位置是先下到上,在每一层是由里到外逆时针方向标识  
  17.         int vertices[] = {  
  18.                 -one, -one, -one,  
  19.                 one, -one, -one,  
  20.                 one,  one, -one,  
  21.                 -one,  one, -one,  
  22.                 -one, -one,  one,  
  23.                 one, -one,  one,  
  24.                 one,  one,  one,  
  25.                 -one,  one,  one,  
  26.         };  
  27.         //每个顶点的颜色由四个数字表示:RED/GREEN/BLUE/ALPHA,最后一个透明度是可选的  
  28.         int colors[] = {  
  29.                 0,    0,    0,  one,  
  30.                 one,    0,    0,  one,  
  31.                 one,  one,    0,  one,  
  32.                 0,  one,    0,  one,  
  33.                 0,    0,  one,  one,  
  34.                 one,    0,  one,  one,  
  35.                 one,  one,  one,  one,  
  36.                 0,  one,  one,  one,  
  37.         };  
  38.         //这里有点复杂,每个数字对应于正方体中的每个特定的点。比如0代表立方体原点,就是立方体下面一层中最后面的那个点。  
  39.         //那么0,4,5对应的就是立方体侧面上的一个三角,每个面都有两个三角组成。  
  40.         //这样,整个立方体有六个面,就有12个三角面了。  
  41.         //注意:点的排列顺序对于显示效果有很大的影响。比如:0,4,5和0,5,4就不一样。  
  42.         //之所以会这样的原因是因为,调用了gl.glFrontFace(gl.GL_CW).  
  43.         //这样我们需要以顺时针的顺序来指定可视的三角面。  
  44.         byte indices[] = {  
  45.                 045,    051,  
  46.                 156,    162,  
  47.                 267,    273,  
  48.                 374,    340,  
  49.                 476,    465,  
  50.                 301,    312  
  51.         };  
  52.         //这里使用ByteBuffer来做缓冲处理。必须通过ByteBuffer.allocateDirect()方法来实例化ByteBuffer对象  
  53.         //这些buffer必须放到本地堆栈中,以使垃圾回收器不能移除它们  
  54.         //这些缓冲将作为参数传入到gl*Pointer()方法中  
  55.         //对于不同原数据类型的Buffers需要将byte设置成对应的顺序  
  56.         //int类型的是每个点式四个字节。  
  57.         ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);  
  58.         vbb.order(ByteOrder.nativeOrder());  
  59.         mVertexBuffer = vbb.asIntBuffer();  
  60.         mVertexBuffer.put(vertices);  
  61.         mVertexBuffer.position(0);  
  62.         ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4);  
  63.         cbb.order(ByteOrder.nativeOrder());  
  64.         mColorBuffer = cbb.asIntBuffer();  
  65.         mColorBuffer.put(colors);  
  66.         mColorBuffer.position(0);  
  67.         mIndexBuffer = ByteBuffer.allocateDirect(indices.length);  
  68.         mIndexBuffer.put(indices);  
  69.         mIndexBuffer.position(0);  
  70.     }  
  71.     //让Cube来绘制自己,传入GL10g  
  72.     //GL10里包含很多绘制3D图刑的接口  
  73.     public void draw(GL10 gl)  
  74.     {  
  75.         gl.glFrontFace(gl.GL_CW);  
  76.         gl.glVertexPointer(3, gl.GL_FIXED, 0, mVertexBuffer);  
  77.         gl.glColorPointer(4, gl.GL_FIXED, 0, mColorBuffer);  
  78.         gl.glDrawElements(gl.GL_TRIANGLES, 36, gl.GL_UNSIGNED_BYTE, mIndexBuffer);  
  79.     }  
  80.     private IntBuffer   mVertexBuffer;  
  81.     private IntBuffer   mColorBuffer;  
  82.     private ByteBuffer  mIndexBuffer;  
  83. }  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值