在android使用OPENGL总结

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. 主要代码链接

你可能感兴趣的:(基础知识积累)