OpenGL ES之GLSurfaceView学习

来源:互联网 发布:网络暴力调查数据图 编辑:程序博客网 时间:2024/05/19 02:00

OpenGL ES之GLSurfaceView学习包括三个部分:


android Surface和SurfaceView概述:
http://blog.csdn.net/hankersyan/article/details/6124998

android.opengl.GLSurfaceView概述:
http://blog.csdn.net/hankersyan/article/details/6124998

android.opengl.GLSurfaceView.Renderer概述:
http://blog.csdn.net/hankersyan/article/details/6125004

====================================================================================================================================

使用GLSurfaceView开发3D应用时,如果是非交互式的应用,可以直接使用GLSurfaceView。如果需要交互式的行为,则需要继承GLSurfaceView并重写一些方法

OpenGL ES之GLSurfaceView学习:非交互式的实例

[java] view plaincopy
  1. import javax.microedition.khronos.egl.EGLConfig;  
  2. import javax.microedition.khronos.opengles.GL10;  
  3. import android.app.Activity;  
  4. import android.opengl.GLSurfaceView;  
  5. import android.opengl.GLSurfaceView.Renderer;  
  6. import android.os.Bundle;  
  7. import android.provider.OpenableColumns;  
  8. /** 
  9.  * 本示例演示OpenGL ES开发3D应用 
  10.  * 该Activity直接使用了GLSurfaceView 
  11.  * 这是因为GLSurfaceView可以直接使用,除非需要接受用户输入,和用户交互,才需要重写一些GLSurfaceView的方法 
  12.  * 如果开发一个非交互式的OpenGL应用,可以直接使用GLSurfaceView。参照本示例 
  13.  * @author Administrator 
  14.  * 
  15.  */  
  16. public class NonInteractiveDemo extends Activity {  
  17.       
  18.     private GLSurfaceView mGLView;  
  19.       
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.           
  24.         mGLView = new GLSurfaceView(this);  
  25.         //这里需要指定一个自定义的渲染器  
  26.         mGLView.setRenderer(new DemoRenderer());  
  27.         setContentView(mGLView);  
  28.           
  29.     }  
  30.       
  31.       
  32.     public void onPause(){  
  33.         super.onPause();  
  34.         mGLView.onPause(); //当Activity暂停时,告诉GLSurfaceView也停止渲染,并释放资源。  
  35.     }  
  36.       
  37.     public void onResume(){  
  38.         super.onResume();  
  39.         mGLView.onResume(); //当Activity恢复时,告诉GLSurfaceView加载资源,继续渲染。  
  40.     }  
  41.       
  42.       
  43.       
  44.       
  45. }  
  46. class DemoRenderer implements Renderer{  
  47.     @Override  
  48.     public void onDrawFrame(GL10 gl) {  
  49.         //每帧都需要调用该方法进行绘制。绘制时通常先调用glClear来清空framebuffer。  
  50.         //然后调用OpenGL ES其他接口进行绘制  
  51.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);  
  52.           
  53.     }  
  54.     @Override  
  55.     public void onSurfaceChanged(GL10 gl, int w, int h) {  
  56.         //当surface的尺寸发生改变时,该方法被调用,。往往在这里设置ViewPort。或者Camara等。   
  57.         gl.glViewport(00, w, h);  
  58.     }  
  59.     @Override  
  60.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  61.         // 该方法在渲染开始前调用,OpenGL ES的绘制上下文被重建时也会调用。  
  62.         //当Activity暂停时,绘制上下文会丢失,当Activity恢复时,绘制上下文会重建。  
  63.           
  64.         //do nothing special  
  65.     }  
  66.       

OpenGL ES之GLSurfaceView学习:交互式的实例

[java] view plaincopy
  1. import javax.microedition.khronos.egl.EGLConfig;  
  2. import javax.microedition.khronos.opengles.GL10;  
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.opengl.GLSurfaceView;  
  6. import android.os.Bundle;  
  7. import android.view.MotionEvent;  
  8. /** 
  9.  * 本示例演示OpenGL ES开发3D应用 
  10.  * 该Activity使用了自定义的GLSurfaceView的子类 
  11.  * 这样,我们可以开发出和用户交互的应用,比如游戏等。 
  12.  * 需要注意的是:由于渲染对象是运行在一个独立的渲染线程中,所以 
  13.  * 需要采用跨线程的机制来进行事件的处理。但是Android提供了一个简便的方法 
  14.  * 我们只需要在事件处理中使用queueEvent(Runnable)就可以了. 
  15.  *  
  16.  * 对于大多数3D应用,如游戏、模拟等都是持续性渲染,但对于反应式应用来说,只有等用户进行了某个操作后再开始渲染。 
  17.  * GLSurfaceView支持这两种模式。通过调用方法setRenderMode()方法设置。 
  18.  * 调用requestRender()继续渲染。 
  19.  *  
  20.  *  
  21.  * @author Administrator 
  22.  * 
  23.  */  
  24. public class InteractiveDemo extends Activity {  
  25.       
  26.     private GLSurfaceView mGLView;  
  27.       
  28.     public void onCreate(Bundle savedInstanceState){  
  29.         super.onCreate(savedInstanceState);  
  30.         mGLView = new DemoGLSurfaceView(this); //这里使用的是自定义的GLSurfaceView的子类  
  31.         setContentView(mGLView);  
  32.     }  
  33.       
  34.       
  35.     public void onPause(){  
  36.         super.onPause();  
  37.         mGLView.onPause();  
  38.     }  
  39.       
  40.     public void onResume(){  
  41.         super.onResume();  
  42.         mGLView.onResume();  
  43.     }  
  44. }  
  45. class DemoGLSurfaceView extends GLSurfaceView{  
  46.     DemoRenderer2 mRenderer;  
  47.       
  48.     public DemoGLSurfaceView(Context context) {  
  49.         super(context);  
  50.         //为了可以激活log和错误检查,帮助调试3D应用,需要调用setDebugFlags()。  
  51.         this.setDebugFlags(DEBUG_CHECK_GL_ERROR|DEBUG_LOG_GL_CALLS);  
  52.         mRenderer = new DemoRenderer2();  
  53.         this.setRenderer(mRenderer);  
  54.     }  
  55.       
  56.     public boolean onTouchEvent(final MotionEvent event){  
  57.         //由于DemoRenderer2对象运行在另一个线程中,这里采用跨线程的机制进行处理。使用queueEvent方法  
  58.         //当然也可以使用其他像Synchronized来进行UI线程和渲染线程进行通信。  
  59.         this.queueEvent(new Runnable() {  
  60.               
  61.             @Override  
  62.             public void run() {  
  63.                   
  64.                 //TODO:  
  65.                 mRenderer.setColor(event.getX()/getWidth(), event.getY()/getHeight(), 1.0f);  
  66.             }  
  67.         });  
  68.           
  69.         return true;  
  70.     }  
  71.       
  72. }  
  73. /** 
  74.  * 这个应用在每一帧中清空屏幕,当tap屏幕时,改变屏幕的颜色。 
  75.  * @author Administrator 
  76.  * 
  77.  */  
  78. class DemoRenderer2 implements GLSurfaceView.Renderer{  
  79.       
  80.     private float mRed;  
  81.     private float mGreen;  
  82.     private float mBlue;  
  83.     @Override  
  84.     public void onDrawFrame(GL10 gl) {  
  85.         // TODO Auto-generated method stub  
  86.         gl.glClearColor(mRed, mGreen, mBlue, 1.0f);  
  87.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);  
  88.     }  
  89.     @Override  
  90.     public void onSurfaceChanged(GL10 gl, int w, int h) {  
  91.         // TODO Auto-generated method stub  
  92.         gl.glViewport(00, w, h);  
  93.     }  
  94.     @Override  
  95.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  96.         // TODO Auto-generated method stub  
  97.           
  98.     }  
  99.       
  100.     public void setColor(float r, float g, float b){  
  101.         this.mRed = r;  
  102.         this.mGreen = g;  
  103.         this.mBlue = b;  
  104.     }  
  105.       





原创粉丝点击