Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .

有了前面关于Android OpenGL ES的介绍,可以开始创建示例程序OpenGLDemos。

使用Eclipse 创建一个Android项目

  • Project Name: OpenGLDemos
  • Build Target: Android 1.6 ( >1.5 即可)
  • Application Name: Android OpenGL ES Demos
  • Package Name: com.pstreets.opengl.demo
  • Create Activity:AndroidOpenGLDemo
创建一个OpenGLRenderer 实现 GLSurfaceView.Renderer接口:
OpenGLRenderer.java
package com.example.gltest;

import javax.microedition.khronos.opengles.GL10;

import android.opengl.EGLConfig;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLU;

public class OpenGLRenderer implements Renderer {
     
     private final IOpenGLDemo openGLDemo;
     public OpenGLRenderer(IOpenGLDemo demo){
     openGLDemo=demo;
     }
     
     public void onSurfaceCreated(GL10 gl, EGLConfig config) {
     // Set the background color to black ( rgba ).
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
     // Enable Smooth Shading, default not really needed.
     gl.glShadeModel(GL10.GL_SMOOTH);
     // Depth buffer setup.
     gl.glClearDepthf(1.0f);
     // Enables depth testing.
     gl.glEnable(GL10.GL_DEPTH_TEST);
     // The type of depth testing to do.
     gl.glDepthFunc(GL10.GL_LEQUAL);
     // Really nice perspective calculations.
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
     GL10.GL_NICEST);
     
     }
     
     public void onDrawFrame(GL10 gl) {
     if(openGLDemo!=null){
     openGLDemo.DrawScene(gl);
     }
     
     }
     
     public void onSurfaceChanged(GL10 gl, int width, int height) {
     // Sets the current view port to the new size.
     gl.glViewport(0, 0, width, height);
     // Select the projection matrix
     gl.glMatrixMode(GL10.GL_PROJECTION);
     // Reset the projection matrix
     gl.glLoadIdentity();
     // Calculate the aspect ratio of the window
     GLU.gluPerspective(gl, 45.0f,
     (float) width / (float) height,
     0.1f, 100.0f);
     // Select the modelview matrix
     gl.glMatrixMode(GL10.GL_MODELVIEW);
     // Reset the modelview matrix
     gl.glLoadIdentity();
     }

    @Override
    public void onSurfaceCreated(GL10 arg0,
            javax.microedition.khronos.egl.EGLConfig arg1) {
        // TODO Auto-generated method stub
        
    }
    }

 

为简洁起见,为所有的示例定义了一个接口IOpenGLDemo,
定义在IOpenGLDemo.java

 

package com.example.gltest;

import javax.microedition.khronos.opengles.GL10;

public interface IOpenGLDemo {
     public void DrawScene(GL10 gl);
     
    }

 

DrawScene 用于实际的GL绘图示例代码,其它的初始化工作基本就由GLSurfaceView 和OpenGLRenderer 完成,其中onSurfaceCreated 和 onSurfaceChanged 中的代码含义现在无需了解,后面会有具体介绍,只要知道它们是用来初始化GLSurfaceView就可以了。

最后使用一个简单的例子“Hello World”结束本篇,“Hello World” 使用红色背景刷新屏幕。

MainActivity.java

package com.example.gltest;

import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity
       implements IOpenGLDemo{

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow()
             .setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
     
            mGLSurfaceView = new GLSurfaceView(this);
            mGLSurfaceView.setRenderer(new OpenGLRenderer(this));
            setContentView(mGLSurfaceView);
        }
     
        public void DrawScene(GL10 gl) {
            gl.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
            // Clears the screen and depth buffer.
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT
              | GL10.GL_DEPTH_BUFFER_BIT);
     
        }
     
        @Override
        protected void onResume() {
            // Ideally a game should implement
            // onResume() and onPause()
            // to take appropriate action when the
            //activity looses focus
            super.onResume();
            mGLSurfaceView.onResume();
        }
     
        @Override
        protected void onPause() {
            // Ideally a game should implement onResume()
            //and onPause()
            // to take appropriate action when the
            //activity looses focus
            super.onPause();
            mGLSurfaceView.onPause();
        }
     
        private GLSurfaceView mGLSurfaceView;
     
    }

结果如下:

 

posted @ 2015-04-21 09:58  Anita-ff  阅读(480)  评论(0编辑  收藏  举报