GLRenderer.java
上传用户:xmjingguan
上传日期:2009-07-06
资源大小:2054k
文件大小:5k
源码类别:

android开发

开发平台:

Java

  1. /***  * Excerpted from "Hello, Android!",  * published by The Pragmatic Bookshelf.  * Copyrights apply to this code. It may not be used to create training material,   * courses, books, articles, and the like. Contact us if you are in doubt.  * We make no guarantees that this code is fit for any purpose.   * Visit http://www.pragmaticprogrammer.com/titles/eband for more book information. ***/
  2. package org.example.opengl;
  3. import javax.microedition.khronos.egl.EGLConfig;
  4. import javax.microedition.khronos.opengles.GL10;
  5. import android.content.Context;
  6. import android.opengl.GLSurfaceView;
  7. import android.opengl.GLU;
  8. import android.util.Log;
  9. class GLRenderer implements GLSurfaceView.Renderer {
  10.    private static final String TAG = "GLRenderer";
  11.    private final Context context;
  12.    
  13.    
  14.    private final GLCube cube = new GLCube();
  15.    
  16.    
  17.    private long startTime;
  18.    private long fpsStartTime;
  19.    private long numFrames;
  20.    
  21.    
  22.    GLRenderer(Context context) {
  23.       this.context = context;
  24.    }
  25.    
  26.    
  27.    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  28.       
  29.       // ...
  30.       
  31.       
  32.       
  33.       boolean SEE_THRU = true;
  34.       
  35.       
  36.       startTime = System.currentTimeMillis();
  37.       fpsStartTime = startTime;
  38.       numFrames = 0;
  39.       
  40.       
  41.       // Define the lighting
  42.       float lightAmbient[] = new float[] { 0.2f, 0.2f, 0.2f, 1 };
  43.       float lightDiffuse[] = new float[] { 1, 1, 1, 1 };
  44.       float[] lightPos = new float[] { 1, 1, 1, 1 };
  45.       gl.glEnable(GL10.GL_LIGHTING);
  46.       gl.glEnable(GL10.GL_LIGHT0);
  47.       gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0);
  48.       gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0);
  49.       gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPos, 0);
  50.       
  51.       
  52.       // What is the cube made of?
  53.       float matAmbient[] = new float[] { 1, 1, 1, 1 };
  54.       float matDiffuse[] = new float[] { 1, 1, 1, 1 };
  55.       gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,
  56.             matAmbient, 0);
  57.       gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE,
  58.             matDiffuse, 0);
  59.       
  60.       
  61.       // Set up any OpenGL options we need
  62.       gl.glEnable(GL10.GL_DEPTH_TEST);        gl.glDepthFunc(GL10.GL_LEQUAL);
  63.       gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  64.       // Optional: disable dither to boost performance
  65.       // gl.glDisable(GL10.GL_DITHER);
  66.       
  67.       
  68.       // ...
  69.       if (SEE_THRU) {
  70.          gl.glDisable(GL10.GL_DEPTH_TEST);
  71.          gl.glEnable(GL10.GL_BLEND);
  72.          gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);
  73.       }
  74.       
  75.       
  76.       // Enable textures
  77.       gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  78.       gl.glEnable(GL10.GL_TEXTURE_2D);
  79.       // Load the cube's texture from a bitmap
  80.       GLCube.loadTexture(gl, context, R.drawable.android);
  81.       
  82.       
  83.       
  84.       
  85.    }
  86.    
  87.    
  88.    
  89.    public void onSurfaceChanged(GL10 gl, int width, int height) {
  90.       
  91.       // ...
  92.       
  93.       
  94.       // Define the view frustum
  95.       gl.glViewport(0, 0, width, height);
  96.       gl.glMatrixMode(GL10.GL_PROJECTION);
  97.       gl.glLoadIdentity();
  98.       float ratio = (float) width / height;
  99.       GLU.gluPerspective(gl, 45.0f, ratio, 1, 100f);        
  100.    }
  101.    
  102.    
  103.    
  104.    
  105.    public void onDrawFrame(GL10 gl) {
  106.       
  107.       // ...
  108.       
  109.       
  110.       
  111.       
  112.       // Clear the screen to black
  113.       gl.glClear(GL10.GL_COLOR_BUFFER_BIT
  114.             | GL10.GL_DEPTH_BUFFER_BIT);
  115.       // Position model so we can see it
  116.       gl.glMatrixMode(GL10.GL_MODELVIEW);
  117.       gl.glLoadIdentity();
  118.       gl.glTranslatef(0, 0, -3.0f);
  119.       // Other drawing commands go here...
  120.       
  121.       
  122.       // Set rotation angle based on the time
  123.       long elapsed = System.currentTimeMillis() - startTime;
  124.       gl.glRotatef(elapsed * (30f / 1000f), 0, 1, 0);
  125.       gl.glRotatef(elapsed * (15f / 1000f), 1, 0, 0);
  126.       
  127.       // Draw the model
  128.       cube.draw(gl);
  129.       
  130.       
  131.       
  132.       // Keep track of number of frames drawn
  133.       numFrames++;
  134.       long fpsElapsed = System.currentTimeMillis() - fpsStartTime;
  135.       if (fpsElapsed > 5 * 1000) { // every 5 seconds
  136.          float fps = (numFrames * 1000.0F) / fpsElapsed;
  137.          Log.d(TAG, "Frames per second: " + fps + " (" + numFrames
  138.                + " frames in " + fpsElapsed + " ms)");
  139.          fpsStartTime = System.currentTimeMillis();
  140.          numFrames = 0;
  141.       }
  142.       
  143.       
  144.       
  145.       
  146.       
  147.    }
  148.    
  149.    
  150.    
  151. }