Android的OpenGL学习笔记(1)

来源:互联网 发布:外国的聊天软件 编辑:程序博客网 时间:2024/05/10 09:50

                                                                             Android的OpenGL学习笔记(1)

先写第一个程序,介绍OpenGL的某些知识和框架结构:

MainActivity,Vortex.java代码:

Code:
  1. package com.droidnova.android.games.vortex;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class Vortex extends Activity {  
  7.     //private static final String LOG_TAG = Vortex.class.getSimpleName();  
  8.     private VortexView _vortexView;  
  9.       
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         _vortexView = new VortexView(this);  
  14.         setContentView(_vortexView);  
  15.     }  
  16. }  
  17. /*@Override 
  18. protected void onPause() { 
  19.     super.onPause(); 
  20.     _vortexView.onPause(); 
  21. } 
  22.  
  23. @Override 
  24. protected void onResume() { 
  25.     super.onResume(); 
  26.     _vortexView.onResume(); 
  27. }*/  

我们继承了GLSurfaceView是因为它会帮助我们画3D图像。接下来看VortexRenderer类。一个Renderer包含画一帧所必需的所有东西。

VortexRendere.java

Code:
  1. package com.droidnova.android.games.vortex;  
  2.   
  3. import javax.microedition.khronos.egl.EGLConfig;  
  4. import javax.microedition.khronos.opengles.GL10;  
  5.   
  6. import android.opengl.GLSurfaceView;  
  7.   
  8. public class VortexRenderer implements GLSurfaceView.Renderer {  
  9.     //private static final String LOG_TAG = VortexRenderer.class.getSimpleName();  
  10.       
  11.     private float _red = 0.9f;  
  12.     private float _green = 0.2f;  
  13.     private float _blue = 0.2f;  
  14.       
  15.     //当窗口创建的时候需要调用onSurfaceCreated,所以我们可以在里面对OpenGL做一些初始化的工作  
  16.     @Override  
  17.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  18.         // Do nothing special.  
  19.     }  
  20.     //surface发生改变的时候调用,例如从竖屏切换到横屏的时候。当窗口的大小发生改变的时候,当然,不管窗口的大小是否已经改变。  
  21.     //它在程序开始时至少运行一次,所以我们在该方法中设置OpenGL场景的大小  
  22.     @Override  
  23.     public void onSurfaceChanged(GL10 gl, int w, int h) {  
  24.         gl.glViewport(00, w, h);//设置OpenGL场景的大小,这里设置的和屏幕同样大小  
  25.     }  
  26.     //当任何时候调用一个画图方法的时候。即所有的绘图操作都在onDrawFrame方法中进行,在绘图之前,需要将屏幕清除成前面所指定的颜色,  
  27.     //清除深度缓存,并且重置场景,然后就可以进行绘图了!  
  28.     @Override  
  29.     public void onDrawFrame(GL10 gl) {  
  30.         // define the color we want to be displayed as the "clipping wall"  
  31.         gl.glClearColor(_red, _green, _blue, 1.0f);//为底色定义了颜色  
  32.         // clear the color buffer to show the ClearColor we called above...  
  33.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT);//GL10,这里的10代表1.0版本。清空颜色缓存。目前Android中的版本只达到1.1  
  34.     }  
  35.   
  36.     public void setColor(float r, float g, float b) {  
  37.         _red = r;  
  38.         _green = g;  
  39.         _blue = b;  
  40.     }  
  41. }  

VortexView.java代码:(属于自定义View)

Code:
  1. package com.droidnova.android.games.vortex;  
  2.   
  3. import android.content.Context;  
  4. import android.opengl.GLSurfaceView;  
  5. import android.view.MotionEvent;  
  6.   
  7. public class VortexView extends GLSurfaceView {  
  8.     //private static final String LOG_TAG = VortexView.class.getSimpleName();  
  9.     private VortexRenderer _renderer;  
  10.       
  11.     public VortexView(Context context) {  
  12.         super(context);  
  13.         _renderer = new VortexRenderer();  
  14.         setRenderer(_renderer);  
  15.     }  
  16.       
  17.     public boolean onTouchEvent(final MotionEvent event) {  
  18.         queueEvent(new Runnable() {  
  19.             public void run() {  
  20.                 _renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);  
  21.             }  
  22.         });  
  23.         return true;  
  24.     }  
  25. }  
  26. /*public boolean onTouchEvent(final MotionEvent event) { 
  27.         queueEvent(new Runnable(){ 
  28.             public void run() { 
  29.                 _renderer.setColor(event.getX() / getWidth(), 
  30.                         event.getY() / getHeight(), 1.0f); 
  31.             }}); 
  32.         return true; 
  33.     }*/  

恩,基本上就这些代码,不需要任何布局!更详细的OpenGL知识可以参考计算机图形学!和以往一样,必要的解释都在代码注释中,如有不懂,可以留言提出!如有错误,请留言指出,这些都是些个人学习总结!

原创粉丝点击