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”
可以使用如下函数进行转化:

<ol class="linenums"><li class="L0" style="margin: 0px; padding: 0px;"><code><span class="kwd" style="margin: 0px; padding: 0px;">private</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="typ" style="margin: 0px; padding: 0px;">FloatBuffer</span><span class="pln" style="margin: 0px; padding: 0px;"> floatBufferUtil</span><span class="pun" style="margin: 0px; padding: 0px;">(</span><span class="kwd" style="margin: 0px; padding: 0px;">float</span><span class="pun" style="margin: 0px; padding: 0px;">[]</span><span class="pln" style="margin: 0px; padding: 0px;"> arr</span><span class="pun" style="margin: 0px; padding: 0px;">)</span></code></li><li class="L1" style="margin: 0px; padding: 0px;"><code>{</code></li><li class="L2" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    </span><span class="typ" style="margin: 0px; padding: 0px;">FloatBuffer</span><span class="pln" style="margin: 0px; padding: 0px;"> mBuffer</span><span class="pun" style="margin: 0px; padding: 0px;">;</span></code></li><li class="L3" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    </span><span class="com" style="margin: 0px; padding: 0px;">// 初始化ByteBuffer,长度为arr数组的长度*4,因为一个int占4个字节</span></code></li><li class="L4" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    </span><span class="typ" style="margin: 0px; padding: 0px;">ByteBuffer</span><span class="pln" style="margin: 0px; padding: 0px;"> qbb </span><span class="pun" style="margin: 0px; padding: 0px;">=</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="typ" style="margin: 0px; padding: 0px;">ByteBuffer</span><span class="pun" style="margin: 0px; padding: 0px;">.</span><span class="pln" style="margin: 0px; padding: 0px;">allocateDirect</span><span class="pun" style="margin: 0px; padding: 0px;">(</span><span class="pln" style="margin: 0px; padding: 0px;">arr</span><span class="pun" style="margin: 0px; padding: 0px;">.</span><span class="pln" style="margin: 0px; padding: 0px;">length </span><span class="pun" style="margin: 0px; padding: 0px;">*</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="lit" style="margin: 0px; padding: 0px;">4</span><span class="pun" style="margin: 0px; padding: 0px;">);</span></code></li><li class="L5" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    </span><span class="com" style="margin: 0px; padding: 0px;">// 数组排列用nativeOrder</span></code></li><li class="L6" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    qbb</span><span class="pun" style="margin: 0px; padding: 0px;">.</span><span class="pln" style="margin: 0px; padding: 0px;">order</span><span class="pun" style="margin: 0px; padding: 0px;">(</span><span class="typ" style="margin: 0px; padding: 0px;">ByteOrder</span><span class="pun" style="margin: 0px; padding: 0px;">.</span><span class="pln" style="margin: 0px; padding: 0px;">nativeOrder</span><span class="pun" style="margin: 0px; padding: 0px;">());</span></code></li><li class="L7" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    mBuffer </span><span class="pun" style="margin: 0px; padding: 0px;">=</span><span class="pln" style="margin: 0px; padding: 0px;"> qbb</span><span class="pun" style="margin: 0px; padding: 0px;">.</span><span class="pln" style="margin: 0px; padding: 0px;">asFloatBuffer</span><span class="pun" style="margin: 0px; padding: 0px;">();</span></code></li><li class="L8" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    mBuffer</span><span class="pun" style="margin: 0px; padding: 0px;">.</span><span class="pln" style="margin: 0px; padding: 0px;">put</span><span class="pun" style="margin: 0px; padding: 0px;">(</span><span class="pln" style="margin: 0px; padding: 0px;">arr</span><span class="pun" style="margin: 0px; padding: 0px;">);</span></code></li><li class="L9" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    mBuffer</span><span class="pun" style="margin: 0px; padding: 0px;">.</span><span class="pln" style="margin: 0px; padding: 0px;">position</span><span class="pun" style="margin: 0px; padding: 0px;">(</span><span class="lit" style="margin: 0px; padding: 0px;">0</span><span class="pun" style="margin: 0px; padding: 0px;">);</span></code></li><li class="L0" style="margin: 0px; padding: 0px;"><code><span class="pln" style="margin: 0px; padding: 0px;">    </span><span class="kwd" style="margin: 0px; padding: 0px;">return</span><span class="pln" style="margin: 0px; padding: 0px;"> mBuffer</span><span class="pun" style="margin: 0px; padding: 0px;">;</span></code></li><li class="L1" style="margin: 0px; padding: 0px;"><code><span class="pun" style="margin: 0px; padding: 0px;">}</span><span class="pln" style="margin: 0px; padding: 0px;"> </span></code></li></ol>

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(安卓)matrix 控制图片的旋转、缩放、移动
  2. Android中dispatchDraw分析
  3. 锁屏界面
  4. android OpenGL ES2.0编程初学
  5. android和j2me之清屏(clearScreen)
  6. [置顶] android 图标的绘制
  7. android和j2me之清屏(clearScreen)
  8. Android绘制简单折线图的步骤
  9. android 虚拟摇杆绘制

随机推荐

  1. Android(安卓)exfat移植指南
  2. Android基于ViewPager+Fragment实现左右
  3. android drawerlayout
  4. EditText中隐藏Android输入法窗口
  5. 字符串类的重量级实现——Rope的初步了解
  6. Android(安卓)SQLiteOpenHelper使用和源
  7. 内部类联想到Android的Listener
  8. Android 布局(LinearLayout\TableLayout
  9. app在android 6.0或以上平台版本运行过程
  10. adb,logcat使用及对Android设备的操作