Android高级进阶四 Android OpenGL开发多边形

时间:2022-03-21 14:26:49

最新版本:Android高级进阶四 Android OpenGL开发多边形

         有了上一篇Android高级进阶三 Android OpenGL | ES开发框架的介绍,我们现在就来开发一个最简单的静态三角形和静态四边形为例,绝大部分代码我都加上了注释,看官看就可以了~~

        先上效果图:

Android高级进阶四 Android OpenGL开发多边形        

        源码如下:

  1. package org.ourunix.android.opengltest;  
  2.   
  3. import java.nio.ByteBuffer;  
  4. import java.nio.ByteOrder;  
  5. import java.nio.IntBuffer;  
  6.   
  7. import javax.microedition.khronos.egl.EGLConfig;  
  8. import javax.microedition.khronos.opengles.GL10;  
  9.   
  10. import android.app.Activity;  
  11. import android.opengl.GLSurfaceView;  
  12. import android.opengl.GLSurfaceView.Renderer;  
  13. import android.os.Bundle;  
  14.   
  15. public class OpenGLTestActivity extends Activity {  
  16.     /** Called when the activity is first created. */  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.        GLSurfaceView glView = new GLSurfaceView(this);  
  21.        Renderer render = new GLRender();  
  22.        glView.setRenderer(render);  
  23.        setContentView(glView);  
  24.     }  
  25.       
  26.     public class GLRender implements Renderer{  
  27.         private int one = 0x10000;  
  28.         private int[] trigger = {0, one, 0, -one, -one, 0, one, -one, 0};  
  29.         private int[] quarter = {one, one, 0, -one, one, 0, one, -one, 0,  
  30.                 -one, -one, 0};  
  31.         //准备三角各顶点  
  32.         private IntBuffer triggerBuffer = BufferUtil.iBuffer(trigger);  
  33.         //准备四边顶点  
  34.         private IntBuffer quarterBuffer = BufferUtil.iBuffer(quarter);  
  35.           
  36.         //咳,咳现在开始画图了  
  37.         @Override  
  38.         public void onDrawFrame(GL10 gl) {  
  39.             // TODO Auto-generated method stub  
  40.             //清楚屏幕和深度缓存  
  41.             gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
  42.             gl.glLoadIdentity();  
  43.             //现将屏幕向左移动,用来画三角形  
  44.             gl.glTranslatef(-1.5f, 0.0f, -6.0f);  
  45.             //允许设置顶点  
  46.             gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
  47.             //设置三角形  
  48.             gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);  
  49.             //绘制三角形  
  50.             gl.glDrawArrays(GL10.GL_TRIANGLES, 03);  
  51.             //重置  
  52.             gl.glLoadIdentity();  
  53.             //现将屏幕向左移动,用来画四边形  
  54.             gl.glTranslatef(1.5f, 0.0f, -6.0f);  
  55.             //设置四边形  
  56.             gl.glVertexPointer(3, GL10.GL_FIXED, 0, quarterBuffer);  
  57.             //绘制四边形  
  58.             gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 04);  
  59.             gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);  
  60.         }  
  61.   
  62.         //当窗口改变时,调用,至少在创建窗口时调用一次,这边设置下场景大小  
  63.         @Override  
  64.         public void onSurfaceChanged(GL10 gl, int width, int height) {  
  65.             // TODO Auto-generated method stub  
  66.             //设置OpenGL场景大小  
  67.             float ratio = (float) width / height;  
  68.             gl.glViewport(00, width, height);  
  69.             gl.glMatrixMode(GL10.GL_PROJECTION);//设置为投影矩阵模式  
  70.             gl.glLoadIdentity();//重置  
  71.             gl.glFrustumf(-ratio, ratio, -11110);//设置视角  
  72.             gl.glMatrixMode(GL10.GL_MODELVIEW);  
  73.             gl.glLoadIdentity();  
  74.         }  
  75.   
  76.         //当窗口被创建时我们可以做些初始化工作  
  77.         @Override  
  78.         public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  79.             // TODO Auto-generated method stub  
  80.             //告诉系统对透视进行修正  
  81.             gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);  
  82.             //设置清除屏幕时所用的颜色,参数依次为红、绿、蓝、Alpha值  
  83.             gl.glClearColorx(0000);  
  84.             //启用阴影平滑  
  85.             gl.glShadeModel(GL10.GL_SMOOTH);  
  86.             //以下是关于深度缓存的设置,非常重要  
  87.             gl.glClearDepthf(1.0f);//设置深度缓存  
  88.             gl.glEnable(GL10.GL_DEPTH_TEST);//启用深度测试  
  89.             gl.glDepthFunc(GL10.GL_LEQUAL);//所做深度测试的类型  
  90.         }  
  91.           
  92.     }  
  93.       
  94.     public static class BufferUtil {  
  95.         public static IntBuffer intBuffer;  
  96.   
  97.         public static IntBuffer iBuffer(int[] a) {  
  98.             // 先初始化buffer,数组的长度*4,因为一个float占4个字节  
  99.             ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);  
  100.             // 数组排列用nativeOrder  
  101.             mbb.order(ByteOrder.nativeOrder());  
  102.             intBuffer = mbb.asIntBuffer();  
  103.             intBuffer.put(a);  
  104.             intBuffer.position(0);  
  105.             return intBuffer;  
  106.         }  
  107.     }  

        最后关于这个BufferUtil 类,为什么需要?查看这个便知道原因:

        Android开发OpenGL字节序引发的问题