Android为OpenGL ES支持,提供GLSurfaceView组件,这个组件用于显示3D图形。

GLSurfaceView本身并不提供绘制3D图形的功能,而是由GLSurfaceView.Renderer来完成SurfaceView中3D图形的绘制。

1. 在Android中使用OpenGL ES需要三个步骤。

  1. 创建GLSurfaceView组件,使用Activity来显示GLSurfaceView组件。
  2. 为GLSurfaceView组件创建GLSurfaceView.Renderer实例,实现GLSurfaceView.Renderer类时需要实现该接口里的三个方法。
    abstract void onDrawFrame(GL10 gl),绘制GLSurfaceView的当前帧
    abstract void onSurfaceCreated(GL10 gl, EGLConfig config),当GLSurfaceView的大小改变的时回调该方法。
    abstract void onSurfaceChanged(GL10 gl, int width, int height),当GLSurfaceView被创建时回调该方法。
  3. 调用当GLSurfaceView组件的setRenderer()方法制定Renderer对象,该对象完成GLSurfaceView里3D图形的绘制

2. 旋转

public abstract void glRotatef (float angle, float x, float y, float z) ,控制图形中心移动
public abstract void glTranslatef (float x, float y, float z) ,控制图形沿着制定轴转动制定角度

实现OnGestureListener的方法对手势监听,配合上面的两个函数,可以实现图形随着手势变化

3. 关于Buffer

glVertexPointer 设置顶点位置数据时,需要ByteBuffer/InitBuffer等,必须是native Buffer
对于FloatBuffer不可以直接用FloatBuffer.wrap将float[]数组转为FloatBuffer,会报如下错误
“ Must use a native order direct Buffer”
可以使用如下函数进行转化:

        
  1. private FloatBuffer floatBufferUtil(float[] arr)
  2. {
  3. FloatBuffer mBuffer;
  4. // 初始化ByteBuffer,长度为arr数组的长度*4,因为一个int占4个字节
  5. ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
  6. // 数组排列用nativeOrder
  7. qbb.order(ByteOrder.nativeOrder());
  8. mBuffer = qbb.asFloatBuffer();
  9. mBuffer.put(arr);
  10. mBuffer.position(0);
  11. return mBuffer;
  12. }

4. glDrawArrays glDrawElements

 public abstract void glDrawArrays (int mode, int first, int count)  绘制平面图形,第一个参数指定图形的类型,第二个参数指定从那个顶点开始绘制,第三个参数总共绘制的点数 public abstract void glDrawElements (int mode, int count, int type, Buffer indices)  根据indices指定的索引点来绘制三角形,可以绘制3D图形, 第一个参数是绘制图形的类型,第二个参数指定包含多少个顶点,indices包含长度为3N的数组

5. 纹理的设置

public abstract void glGenTextures (int n, int[] textures, int offset)
设置一次性生成n个纹理,所生成的纹理代号放入textures中,offset指定从第几个数组元素开始存放纹理代码
public abstract void glBindTexture (int target, int texture)
将texture纹理绑定到target目标上
public abstract void glTexParameterf (int target, int pname, float param)
为target纹理目标设置属性,第二个参数是属性名,第三个参数是属性值

6. 主要代码链接:

更多相关文章

  1. android的图形报表展示解决方案
  2. Android API开发之OpenGL开发之Android OpenGL之使用GLSurfaceVi
  3. android Parcelable序列化数组String[]
  4. Android中View图形绘制基础
  5. Android 技术-- 图形系统详解
  6. Blog-07-《一周快速上手Kotlin For Android》-之数组
  7. Android图形基础
  8. android OpenGL ES实现渲染到透明的纹理 render to transparent
  9. js将一个数组传给android

随机推荐

  1. 深入理解计算机系统(4.1)------Y86指令集体
  2. [码]值得收藏的好东西
  3. SkyWalking结合Logback获取全局唯一标识
  4. [转载] 王垠: 如何掌握所有的程序语言
  5. SkyWalking 6.x 源码分析 —— 调试环境
  6. ZK Leader选举
  7. 定时删除10天前的Es索引
  8. 分布式日志链路追踪:skywalking + elastic
  9. 什么是垃圾快乐, 以及如何浪费你的时间
  10. 整合SSM框架应用