Android OpenGL学习笔记

大家好,今天我讲一下Android OpenGL,这个系列是我的学习笔记,希望对大家有所帮助!这一节将给大家简洁的介绍一下术语,以及第一个Android OpenGL程序.

首先让我看们看一下术语:

Vertex (顶点)
A vertex is a point in 3D space and is the building block for many objects. In OpenGL you can specify as few as two coordinates (X,Y) and as many as four (X,Y,Z,W). The w-axis is optional, the default value is set to 1.0. The z-axis is also optional, the default value is set to 0. In this series, we will use the three main coordinates X, Y, and Z, since the W is generally used as a placeholder. The plural of vertex is vertices (mainly important for non native speakers, because it may create confusion). All objects are drawn using vertices as their points, so a point will refer to a vertex.

Triangle (三角)
A triangle requires three points to be created. So in OpenGL, we use three vertices to create one.

Polygon (多边形)
A polygon is an object which has at least three connected points. Therefor a triangle is also a polygon.

Primitives (基本实体)
A primitive is a three-dimensional object created using either triangles or polygons. A bit ironic: A detailed model with 50.000 vertices is also a primitive like a low detailed model with 500 vertices.

下面就是我们的第一个Android OpenGL程序:

  1. package  com.android.tutor;  
  2. import  android.app.Activity;  
  3. import  android.opengl.GLSurfaceView;  
  4. import  android.os.Bundle;  
  5. public   class  OpenGl_Lesson1  extends  Activity {  
  6.     public   void  onCreate(Bundle savedInstanceState) {  
  7.         super .onCreate(savedInstanceState);  
  8.           
  9.         GLSurfaceView mGlSurfaceView = new  GLSurfaceView( this );  
  10.           
  11.          
  12.         mGlSurfaceView.setRenderer(new  OpenGLRender());  
  13.         setContentView(mGlSurfaceView);  
  14.           
  15.     }  
  16. }  

我们这里的View是用的GLSurfaceView,但是它要setRenderer()一下,就像我们Activity里面的setContentView()方法一样!

这里的OpenGLRender是我重新写的类,它继承于GLSurfaceView.Renderer,我们要实现其种的三个方法:

onSurfaceCreated(),onSurfaceChanged(),onDrawFrame()。代码如下:

  1. package  com.android.tutor;  
  2. import  javax.microedition.khronos.egl.EGLConfig;  
  3. import  javax.microedition.khronos.opengles.GL10;  
  4. import  android.opengl.GLSurfaceView.Renderer;  
  5. public   class  OpenGLRender  implements  Renderer {  
  6.     @Override   
  7.     public   void  onSurfaceCreated(GL10 gl, EGLConfig config) {  
  8.         // TODO Auto-generated method stub   
  9.           
  10.         gl.glClearColor(0 .9f,  0 .2f,  0 .2f,  1 .0f);  
  11.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT);  
  12.     }  
  13.     @Override   
  14.     public   void  onSurfaceChanged(GL10 gl,  int  width,  int  height) {  
  15.         gl.glViewport(00 , width, height);  
  16.     }  
  17.     @Override   
  18.     public   void  onDrawFrame(GL10 gl) {  
  19.         // TODO Auto-generated method stub   
  20.     }  
  21.       
  22. }  

 第10行就是相当于我们设置画布颜色RGBA(红绿蓝透),第11行这里是清除深度颜色缓存,不加上一句,第10句不起作用,整个View的颜色

还是黑黑的!

运行效果如下:

 

 

 

 

前面讲了一些Android OpenGl 的概念问题,这一节讲给大家讲一下如何画一个三角现出来.

一、新建一个Android工程命名为:OpenGL_Lesson2.

二、修改OpenGL_Lesson2.java代码如下:

  1. package  com.android.tutor;  
  2. import  android.app.Activity;  
  3. import  android.os.Bundle;  
  4. public   class  OpenGL_Lesson2  extends  Activity {  
  5.      
  6.     private  OpenGlView mOpenGlView;  
  7.     public   void  onCreate(Bundle savedInstanceState) {  
  8.         super .onCreate(savedInstanceState);  
  9.         
  10.         mOpenGlView = new  OpenGlView( this );  
  11.         setContentView(mOpenGlView);  
  12.                 
  13.     }  
  14. }  

三、新建一个类OpenGlView.java继承与GLSurfaceView,代码如下:

  1. package  com.android.tutor;  
  2. import  android.content.Context;  
  3. import  android.opengl.GLSurfaceView;  
  4. public   class  OpenGlView  extends  GLSurfaceView {  
  5.       
  6.     private  OpenGlRender mOpenGlRender;  
  7.     public  OpenGlView(Context context) {  
  8.         super (context);  
  9.         mOpenGlRender = new  OpenGlRender();  
  10.         setRenderer(mOpenGlRender);  
  11.     }  
  12.       
  13.       
  14.       
  15. }  

四、新建一个OpenGlRender.java类继承与Renderer,代码如下:

  1. package  com.android.tutor;  
  2. import  java.nio.ByteBuffer;  
  3. import  java.nio.ByteOrder;  
  4. import  java.nio.FloatBuffer;  
  5. import  java.nio.ShortBuffer;  
  6. import  javax.microedition.khronos.egl.EGLConfig;  
  7. import  javax.microedition.khronos.opengles.GL10;  
  8. import  android.opengl.GLSurfaceView.Renderer;  
  9. public   class  OpenGlRender  implements  Renderer {  
  10.       
  11.     private   float  _red = 0f;  
  12.     private   float  _green = 25f;  
  13.     private   float  _blue = 200f;  
  14.       
  15.     private  ShortBuffer _indexBuffer;  
  16.       
  17.     private  FloatBuffer _vertexBuffer;  
  18.       
  19.       
  20.     private   short [] _indicesArray = { 012 };  
  21.     private   int  _nrOfVertices =  3 ;  
  22.     @Override   
  23.     public   void  onSurfaceCreated(GL10 gl, EGLConfig config) {  
  24.           
  25.         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
  26.         initTriangle();  
  27.     }  
  28.     @Override   
  29.     public   void  onSurfaceChanged(GL10 gl,  int  width,  int  height) {  
  30.           
  31.         gl.glViewport(00 , width, height);  
  32.     }  
  33.   
  34.       
  35.     @Override   
  36.     public   void  onDrawFrame(GL10 gl) {  
  37.         gl.glClearColor(_red, _green, _blue, 1 .0f);  
  38.           
  39.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT);  
  40.           
  41.          gl.glColor4f(0 .5f, 0f, 0f,  0 .5f);  
  42.          gl.glVertexPointer(_nrOfVertices, GL10.GL_FLOAT, 0 , _vertexBuffer);  
  43.          gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);  
  44.     }  
  45.       
  46.     private   void  initTriangle() {  
  47.         // float has 4 bytes   
  48.         ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3  *  4 );  
  49.         vbb.order(ByteOrder.nativeOrder());  
  50.         _vertexBuffer = vbb.asFloatBuffer();  
  51.           
  52.         // short has 4 bytes   
  53.         ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2 );  
  54.         ibb.order(ByteOrder.nativeOrder());  
  55.         _indexBuffer = ibb.asShortBuffer();  
  56.           
  57.         float [] coords = {  
  58.             -0 .5f, - 0 .5f, 0f,  // (x1, y1, z1)   
  59.             0 .5f, - 0 .5f, 0f,  // (x2, y2, z2)   
  60.             0f, 0 .5f, 0f  // (x3, y3, z3)   
  61.         };  
  62.           
  63.         _vertexBuffer.put(coords);  
  64.           
  65.         _indexBuffer.put(_indicesArray);  
  66.           
  67.         _vertexBuffer.position(0 );  
  68.         _indexBuffer.position(0 );  
  69.     }  
  70. }  

五、运行之,效果如下:

今天晚上就先不做详细解释了!改日在加上!谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值